public static void main(String[] args) {
int[] arr = {100, 7, 245, 5, 900,234,12,16,3,41,345,1345,234,62,356,3,45,23,45,234,52,34,52,3465,2,345,2,345,2,34,5,234,5,23,45,23,45,23,45,2,573,45,345234,5};
//快速排序法
kuaisu(arr,0,arr.length-1);
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + ",");
}
}
public static void kuaisu(int[] arr, int i, int j) {
//递归出口,切记<=是关键,两个都要!!!缺一不可。
low-1的存在甚至可以导致j的值为-1
if(j<=i)return;
int low = i, hight = j, basenumber = arr[i],swap;
while(true){
/*切记!!!基准数在最左边,则先动hight,基准数归的位也是hight所在位置。因为在进行基准数归位时,
要把一个比基准数小的数换到左边来(也就是基准数所在的最左边),
正好hight所对应的数遇到比基准数小的才会停止,让hight先动,low和hight相遇的位值一定是一个比基准数小的数
如果让low先动,那么low与hight相遇的位置一定是比基准数大的位置。*/
while (true) {
if (arr[hight] >= basenumber) hight--;
//由于arr[hight]等于basenumber也会向左移,所以low>=hight一定要加大于号
if (arr[hight]< basenumber||low>=hight) break;
}
while (true) {
if (arr[low] <= basenumber)low++;
if (arr[low] > basenumber||low>=hight) break;
}
swap = arr[hight];
arr[hight] = arr[low];
arr[low] = swap;
//高低索引已经相遇,一轮排序已经结束,进行基准数归为,直接结束外循环
if(low>=hight){
swap = arr[hight];
arr[hight] = arr[i];
arr[i] = swap;
break;
}
}
//左边
kuaisu(arr,i,low-1);//low-1原因是基准数不再进行排位
//右边
kuaisu(arr,hight+1,j);//hight+1原因是基准数不再进行排位
}
最详细,可以反驳