快排算法的简单实现

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;}需要检查,否则在某些情况下会出错。

原文地址:https://www.cnblogs.com/qcblog/p/7535165.html