一、基本思想
快速排序采用分治的策略,具体如下:选择一个关键值作为基准值,找到一个元素小于比基准值小的都在左边序列(一般是无序的),比基准值大的都在右边(一般是无序的)。一般选用序列第一个元素作为基准值,由序列的最后一个元素从后往前扫描序列,找到一个元素值小于基准值,就将这二个值交换,然后由序列的第一个元素从前向后扫描序列,找到一个元素大于基准值,然后交换这二个值,直到从前到后的扫描索引大于等于从后到前的扫描索引。这时基准数的左边小于基准数,右边大于基准数。然后按照上述方式递归基准数左右二边的子序列,直到子序列大小为1或0,整个序列就有序了。快速排序的平均空间复杂度为O(nlog2n),时间空间度为O(1),快速排序是不稳定的排序。
二、图解
三、代码实现
public class JavaSort { public static void main(String[] args) { int a [] =new int []{3,1,5,2,4}; System.out.println("排序前的数组:"+Arrays.toString(a)); fastSort(a, 0, a.length-1); System.out.println("排序后的数组:"+Arrays.toString(a)); } /** * * @param ary 未排序数组 * @param before (子)序列最前面的索引 * @param after (子)序列最后面的索引 */ public static void fastSort(int[] ary,int before,int after ) { int begin = before; int end = after ; int key = ary[before]; while(end>begin){ //从后往前比较 while(end>begin&&ary[end]>=key) //如果没有比关键值小的,比较下一个,直到有比关键值小的交换位置,然后又从前往后比较 end--; if(ary[end]<=key){ int temp = ary[end]; ary[end] = ary[begin]; ary[begin] = temp; } //从前往后比较 while(end>begin&&ary[begin]<=key)//如果没有比关键值大的,比较下一个,直到有比关键值大的交换位置 begin++; if(ary[begin]>=key){ int temp = ary[begin]; ary[begin] = ary[end]; ary[end] = temp; } } //此时第一次循环比较结束,关键值的位置已经确定了。左边的值都比关键值小,右边的值都比关键值大,但是两边的顺序还有可能是不一样的,进行下面的递归调用 //递归关键值左右二边的子序列 if(begin>before) { fastSort(ary,before,begin-1);//递归左边子序列。 } if(end<after ) { fastSort(ary,end+1,after );//递归右边子序列。 } } }