快速排序实现的重点在于数组的拆分,通常我们将数组的第一个元素定义为比较元素,然后将数组中小于比较元素的数放到左边,将大于比较元素的放到右边,
这样我们就将数组拆分成了左右两部分:小于比较元素的数组;大于比较元素的数组。我们再对这两个数组进行同样的拆分,直到拆分到不能再拆分,数组就自然而然地以升序排列了。
partition算法使用头尾两个方向相反的指针进行遍历,先将数组第一个元素设置为比较元素,头指针从左至右找到第一个大于比较元素的数,尾指针从右至左找到第一个小于比较元素的数,全部交换完毕后将比较元素放到中间位置。
public class Main{
//找基准分区
public static int getMiddle(int[] array,int low,int high){
int tmp=array[low];
while(low<high){
while(low<high&&array[high]>tmp){
high--;
}
array[low]=array[high];
while(low<high&&array[low]<tmp){
low++;
}
array[high]=array[low];
}
array[low]=tmp;
return low;
}
//递归不断分区(分治)
public static void _quickSort(int[] array,int low,int high){
if(low<high){
int middle=getMiddle(array,low,high);
_quickSort(array,middle+1,high);
_quickSort(array,low,middle-1);
}
}
public static void quickSort(int[] array){
_quickSort(array,0,array.length-1);
}
public static void main(String[] args){
int[] array={5,2,7,1,9,3,8};
Main qs=new Main();
qs.quickSort(array);
for(int i=0;i<array.length;i++){
System.out.print(array[i]+" ");
}
System.out.println();
}
}
参考文章: