package demo;
public class Demo2 {
public static void main(String[] args) {
int[] arr = new int[]{2,1,5,3,8,4,6};
quickSort(arr,0,arr.length-1);
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
private static void quickSort(int[] arr, int begin, int end) {
if(end<=begin){
return;
}
int i,j,pivot;
i = begin+1;
//有的算法写i=begin,也可以,但要注意while循环中pivot>=arr[i]等号不能少,其余并无差异。
j = end;
pivot = arr[begin];
while(true){
//有的算法中true变为i<j,则需去掉下面的else代码块,且while顺序必须是j--在先,原因是:如果先从左边找,i++后若满足i>=j则停止,i对应一个大于基准的数,再与基准数交换到左边就不对了!若j--在前,则对应一个小于基准数的值可以互换
while(i<=end && pivot>=arr[i]){
//&&为短路机制,括号中&&左右条件的顺序不能颠倒,因为若i=end则arr[i]报空指针异常。
i++;
}
while(arr[j]>=pivot && j>begin){
j--;
}
if(i<j){
swap(arr,i,j);
}else{
break;
}
}
swap(arr,begin,j);
//最终结果要么ij指向同一个数,要么i指向一个大于pivot的数,j指向一个小于pivot的数,且i在j右边并紧挨着j,综合两种情况j换pivot即可。
//若是true变为i<j的情况,则结果只有ij指向同一个数一种情况!
quickSort(arr,begin,j-1);//递归左边的子数组
quickSort(arr,j+1,end);//递归右边的子数组
}
static void swap(int[] arr,int i,int j){
int t;
t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
}
快速排序总结
最新推荐文章于 2023-10-14 22:15:42 发布