public static int binarySearch(int[] array, int value) {
int low = 0;
int high = array.length - 1;
while (low <= high) {
int middle = (low + high) >> 1;
if (value == array[middle]) {
return middle;
}
if (value > array[middle]) {
low = middle + 1;
}
if (value < array[middle]) {
high = middle - 1;
}
}
return -1;
}
原理:从前往后或者从后往前一个一个比较,每次会确定一个未排序中的最大值(最小值)的最终位置
算法分析
public int[] bubbleSort(int[] n) {
//趟数
for (int i = 0; i < n.length - 1; i++) {
//0~i已经有序,从后往前排,后面小的则和前面的交换
for (int j = n.length - 1; j > i; j--) {
if (n[j] < n[j - 1]) {
int temp = n[j - 1];
n[j - 1] = n[j];
n[j] = temp;
}
}
}
return n;
}
原理:每次会确定一个未排序中的最大值(最小值)的最终位置,若从低到高排序,每次选择未排序中最小的和第一个元素交换,直至遍历完列表,再进行下一次选择。
算法分析
public static int[] selectionSort(int[] array) {
if (array.length == 0)
return array;
for (int i = 0; i < array.length; i++) {
int minIndex = i;
for (int j = i; j < array.length; j++) {
if (array[j] < array[minIndex]) //找到最小的数
minIndex = j; //将最小数的索引保存
}
int temp = array[minIndex];
array[minIndex] = array[i];
array[i] = temp;
}
return array;
}
原理:每次会确定一个未排序中的最大值(最小值)的最终位置,若从低到高排序,每次选择未排序中最小的和第一个元素交换,直至遍历完列表,再进行下一次选择。
算法分析
/**
* 插入排序
* @param array
* @return
*/
public static int[] insertionSort(int[] array) {
if (array.length == 0)
return array;
int current;
for (int i = 0; i < array.length - 1; i++) {
current = array[i + 1];
int preIndex = i;
while (preIndex >= 0 && current < array[preIndex]) {
array[preIndex + 1] = array[preIndex];
preIndex--;
}
array[preIndex + 1] = current;
}
return array;
}
原理:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。
算法分析
快速排序使用分治法来把一个串(list)分为两个子串(sub-lists)。具体算法描述如下:
static void quicksort(int n[], int left, int right) {
int dp;
if (left < right) {
dp = partition(n, left, right);
quicksort(n, left, dp - 1);
quicksort(n, dp + 1, right);
}
}
static int partition(int n[], int left, int right) {
int pivot = n[left];
while (left < right) {
while (left < right && n[right] >= pivot)
right--;
n[left++] = n[right];
while (left < right && n[left] <= pivot)
left++;
n[right--] = n[left];
}
n[left] = pivot;
return left;
}
堆排序(Heapsort) 是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。
算法分析
堆排序适用于找出超大量数据的前几名,相比于快速排序,堆排序只需要维护一个很小的树即可完成前几名的排序,而快排可能会有内存溢出的风险。
7.1 算法描述
//声明全局变量,用于记录数组array的长度;
static int len;
/**
* 堆排序算法
*
* @param array
* @return
*/
public static int[] HeapSort(int[] array) {
len = array.length;
if (len < 1) return array;
//1.构建一个最大堆
buildMaxHeap(array);
//2.循环将堆首位(最大值)与末位交换,然后在重新调整最大堆
while (len > 0) {
swap(array, 0, len - 1);
len--;
adjustHeap(array, 0);
}
return array;
}
/**
* 建立最大堆
*
* @param array
*/
public static void buildMaxHeap(int[] array) {
//从最后一个非叶子节点开始向上构造最大堆
//for循环这样写会更好一点:i的左子树和右子树分别2i+1和2(i+1)
for (int i = (len/2- 1); i >= 0; i--) {
adjustHeap(array, i);
}
}
/**
* 调整使之成为最大堆
*
* @param array
* @param i
*/
public static void adjustHeap(int[] array, int i) {
int maxIndex = i;
//如果有左子树,且左子树大于父节点,则将最大指针指向左子树
if (i * 2 < len && array[i * 2] > array[maxIndex])
maxIndex = i * 2 + 1;
//如果有右子树,且右子树大于父节点,则将最大指针指向右子树
if (i * 2 + 1 < len && array[i * 2 + 1] > array[maxIndex])
maxIndex = i * 2 + 2;
//如果父节点不是最大值,则将父节点与最大值交换,并且递归调整与父节点交换的位置。
if (maxIndex != i) {
swap(array, maxIndex, i);
adjustHeap(array, maxIndex);
}
}
class TreeNode{
//节点结构
int value;
TreeNode left;
TreeNode right;
TreeNode(int value) {
this.value = value;
}
}
void preOrder(TreeNode node) {
if (node != null) {
System.out.println(node);
preOrder(node.left);
preOrder(node.right);
}
}
void preOrder2(TreeNode node) {
LinkedList queue = new LinkedList();
TreeNode p = node;
while (p != null || queue.isEmpty()) {
if (p != null) {
queue.add(p);
p = p.left;
} else {
p = (TreeNode) queue.poll();
System.out.println(p);
p = p.right;
}
}
}
void inOrder(TreeNode node) {
Stack stack = new Stack();
TreeNode p = node;
while (p != null || stack.isEmpty()) {
if (p != null) {
stack.push(p);
p = p.left;
} else {
p = (TreeNode) stack.pop();
System.out.println(p);
p = p.right;
}
}
}
void levelOrder(TreeNode node) {
LinkedList queue = new LinkedList();
TreeNode p;
queue.add(node);
while (!queue.isEmpty()) {
p = (TreeNode) queue.poll();
System.out.println(p);
if (p.left != null) {
queue.add(p.left);
}
if (p.right != null) {
queue.add(p.right);
}
}
}