一.问题描述
用快速排序的递归方式对数列{1,0,9,6,5,3,2}进行排序。
二.原理概述
快速排序采用分治的思想,分解问题的规模。其基本思路是从待排序数组中取关键数key,将每个数与Key进行比较,大于key的置于右侧,小于Key的置于右侧,从而达到排序的目的。Key值的选择将大大影响本算法的时间复杂度,经典快速排序一般将Key指定为数组最后一个元素,当数组已经为有序数列,例如{1,2,3,4,5,6},Key值为6,此时,小于Key值得区域和大于Key值的区域长度相差较大,递归的深度将增大,此时复杂度为O(n^2)。所以一般采用随机函数选取Key值,此时复杂度可以保持O(nlogN)。
三.具体实现
将一个数列分为三个区域,less区,equal区,和more区。在切分函数开始的位置,将less赋值l-1(l为数组最左端元素的地址),more赋值为r(r为数组最右端元素的地址)。从array[l]开始,每次和array[r]相比(array[r]就是Key值)。当l指针还没到more指针指向的位置时:
1)如果array[l]<array[r],那么swap(++less,l++)。即less区域向外移动一步后,array[less]和array[l]互换,并且l也向右移动一步。
2)如果array[l]>array[r],那么swap(--more,l)。即more区域向左移动一步后,array[more]和array[l]互换。
3)如果array[l]==array[r],那么l向右移动一步。
四.代码
/*** * Author:spike Wang * Date:2018-6-29 */ public class QuickSort { public static void quick2sort(int array[]) //递归函数入口 { int l=0; int r=array.length-1; quick2sort(array,l,r); } public static void quick2sort(int[] array,int l, int r) //递归函数 { if (l<r) { int key = (int) (Math.random() * (r - l+1)); //随机选取Key值 swap(array,l+ key, r); //将Key值移动到最后的位置 int[] p = partition(array, l, r); quick2sort(array, l, p[0] - 1); quick2sort(array, p[1] + 1, r); } } public static int[] partition(int[] array,int l, int r) //切分函数 { int less=l-1; int more=r; while(l<more) { if (array[l]<array[r]) //小于Key值,less指针向前一步,l指针向前一步 swap(array,++less,l++); else if (array[l]>array[r]) //大于Key值,more指针向后一步 swap(array,--more,l); else l++; //等于Key值,l指针向前一步 } swap(array,more,r); return new int[] {less+1,more}; } public static void swap(int[] array,int l,int r) { int temp=array[l]; array[l]=array[r]; array[r]=temp; }