快排算法的简单实现
java实现:
细节和注解都在注释在代码中了。
1 private static int position(int[] ary,int low,int high){ 2 int i = low,j = high+1; 3 int pivot = ary[low];//选定中轴元素 4 while(true){ 5 while(ary[++i] < pivot) {//遇到大于等于pivot时停下 6 if (i == high) {break;}//此处有必要检查,当pivot刚好为当前序列的最大值时,从此处break出来。 7 } 8 while(ary[--j] > pivot){//遇到小于等于pivot时停下 9 if(j == low){break;}//此处可无需检查,因为j==low时,ary[j] == ary[low],必会在while检查时停下。 10 } 11 // System.out.println("i:"+i+"---"+"j:"+j); 12 if (i >= j) {break;}//退出主循环,注意,i有可能大于j 13 swap(ary, i, j); 14 } 15 swap(ary, low, j);//因为j停下的位置时是小于等于pivot,因此应当让pivot和ary[j]交换 16 return j;//返回pivot在全局下的次序位置 17 } 18 public static void quickSort(int[] ary,int low,int high){ 19 if(low >= high){return;}//递归基,单个元素自然有序 20 int position = position(ary, low, high); 21 quickSort(ary, low, position-1);//low到position-1中的所有元素均<=ary[position] 22 quickSort(ary, position+1, high);//position+1到high中的所有元素均>=ary[position] 23 }
一些值得注意的细节问题:
1、i从low开始,j从high+1开始;i和j指针移动过程中采用++i和--j的形式。
2、if (i == high) {break;}需要检查,否则在某些情况下会出错。