快速排序的思想是将一个数组不断细分,每次都保证小于基准值的在左边大于基准值的在右边(也可以按照需求倒序排列)。
比如一个数组
6 2 7 3 1
lo hi
我们把6拿出来作为基准值,用hi从右向左遍历(把找到的值小于6的放到lo的位置),然后遍历数组用lo从左向右遍历(把遍历到的值大于6的放到hi),当遍历结束时lo==hi此时小于6的在左边大于6的在右边,然后再把基准值左右两边的值作为两个数组继续按照以上的方式排序,不断细分,最终实现一个有序的序列。
package study.fastSort;
/**
* 快速排序
* @author an
*
*/
public class FastSort {
public static int sort(int[] array,int lo ,int hi){
//找基准值
int key = array[lo];
while(lo<hi){
//从右边开始查找小于基准值的值
while(array[hi]>=key&&hi>lo){
hi--;
}
array[lo] = array[hi];
//从左边找大于基准值的的值
while(array[lo]<=key&&hi>lo){
lo++;
}
//基准值放入最后一个移动的值
array[hi]=array[lo];
}
array[hi] = key;
//返回最后基准值的下标
return hi;
}
//递归调用
public static void quickSort(int[] array,int lo,int hi){
if(lo>=hi){
return;
}
int res = sort(array,lo,hi);
//递归基准值左侧 不能从0开始
quickSort(array,lo,res-1);
//递归基准值的右侧
quickSort(array,res+1,array.length-1);
}
public static void main(String[] args) {
int array[] = {6,1,9,7,2,3};
System.out.print("排序前: ");
for(int i=0;i<array.length;i++){
System.out.print(array[i]+" ");
}
quickSort(array,0,array.length-1);
System.out.println();
System.out.print("排序后: ");
for(int i=0;i<array.length;i++){
System.out.print(array[i]+" ");
}
System.out.println();
}
}
运行的结果是:
排序前: 6 1 9 7 2 3
排序后: 1 2 3 6 7 9