快速排序
//选定一个值 将比这个值大的数放在右边 比这个值大的数放在左边
public static void quick(int [] a , int left , int right ) {
int low = left , hight = right;
int temp = a[low] ;
while (low < hight) {
while( low < hight && a[hight] >= temp) { hight --;}
if(low < hight) { a[low ++ ] = a[hight] ; System.out.println(Arrays.toString(a) + " ["+low+"]" + " ["+hight+"]" );}// 将比temp小的数移到左边
while( low < hight && a[low] <= temp ) { low ++ ; } // 此时记住hight 然后 row 开始比较
if(low < hight) { a[hight --] = a[low] ; System.out.println(Arrays.toString(a) + " ["+low+"]" + " ["+hight+"]");}// 将比temp大的数移到右边
}
a[low] = temp;
System.out.println("+----");
System.out.println(Arrays.toString(a));
System.out.println("_----");
if(low>left) quick(a, left, low-1);
if(low<right) quick(a, low+1, right);
}
堆排序
构建堆
// 从i节点开始调整,n为节点总数 从0开始计算 i节点的子节点为 2*i+1(左孩子), 2*i+2 (右孩子)
public static void createMinHeap(int []a , int n, int i) {
int index = i ;
int temp = a[index], j = 2 * index + 1; ;
int len = n;
while ( j < len ) {
if(j + 1 < len && a[j+1] < a[j] ) { //在左右孩子中找最小的
j ++ ;
}
// 如果 j > j+1 则 最小的比根节点大 就已经是一个最小堆啦
if(a [j] >= temp ) {
break;
}
a[index] = a[j]; //最小的放在根节点
index = j; //然后把a[j]作为根节点然后再进行遍历
j = 2 * index + 1; // a[j]的 子节点是 2 * i + 1 2 * i + 2
}
a[index] = temp; //
}
堆排序
for (int i = n - 1; i > 0; i--) {
temp = a[0];
a[0] = a[i];
a[i] = temp;
createMinHeap(a, i, 0);
}
从小到大排序 则选择构建最大堆 从大到小排序 则选择构建最小堆