public class QuickSort {
public static void quickSort(int[] a, int left, int right) {
int pivot = median(a, left, right);
int i = left, j = right - 1;
for(;;){
while (a[++i] < pivot) {
}
while (a[--j] > pivot) {
}
if (i < j)
swap(a, i, j);
else
break;
}
swap(a, i, right - 1); quickSort(a, left, i - 1);
quickSort(a, i + 1, right);
} public static void swap(int[] a, int i, int j) {
int temp = a[i];
a[i] = a[j];
a[j] = temp;
} public static int median(int[] a, int left, int right) {
int center = (left + right) / 2;
if (a[center] < a[left]) {
swap(a, left, center);
}
if (a[right] < a[left]) {
swap(a, left, right);
}
if (a[right] < a[center]) {
swap(a, center, right);
}
swap(a, center, right - 1);
return a[right - 1];
} public static void main(String[] args) {
int[] a = new int[] { 2, 3, 4, 5, 45, 65, 56, 45, 23, 434, 999, 3, 4, 5, 4, 345, 5 }; quickSort(a, 0, a.length - 1); for (int i = 0; i < a.length; i++) {
System.out.print(a[i] + " ");
}
}
}

解决方案 »

  1.   

    是不是因为元素变太少了之后,此时无法用left和right取center,就要用其他O(n2)的算法例如插入来继续排序剩下的数据,而不能再用快排递归了呢?
      

  2.   

    这个是我新学的优化快排方法,不是直接把数组的中间值作为枢纽值了,而是通过一个新的选枢纽的方法原数据:8 1 4 9 6 3 5 2 7 0 
    左边元素是8,右边元素是0 中间位置元素是6 得到三个数8,0,6 
    将这三个数排序得到0,6,8  然后将0放入原数据首位置,6(枢纽元)放入末位置,8放在末位置-1的位置
    然后i指向首位置,j指向末位置-1,i指向比枢纽元大的元素时,j指向比枢纽元小的元素时,i和j互换最后一步,i指向最后一个比枢纽元大的数,此时将i和枢纽元互换,此次排序完成,直到递归结束思路是好的 但是可能是不是数小到一定程度之后就不能用应用以上过程了,因为以前学的快排都是嗷嗷一顿(left+right)/2 所以也不用考虑特殊情况不知道前辈们知道我在说啥不-。-