分治策略排序有两种,一种是本文讲的快排,另外一种是归并排序。
时间复杂度:O(NlogN) 空间复杂度:O(logN)-O(n) 不稳定(因为选择的基准点每次排序后要交换)
快排分析:
快速排序每次以某个值为基准,分为两块,递归此方法,直到每一块只有一个数据。重点在于divide方法。先贴代码,再进行分析。
public static void quickSort(int[] array){
recQuickSort(array, 0, array.length-1);
}
public static void recQuickSort(int[] array,int left,int right){
//基准情况
if(left>=right)
return;
else {
//以最右端数据为标准点
int standard = array[right];
//以standard为准,分为两段
int middle = divide(array,left,right,standard);
//对分的两部分,递归调用本方法
recQuickSort(array,left,middle-1);
recQuickSort(array, middle+1, right);
}
}
public static int divide(int[] array,int left,int right,int standard){
//标记划分区域的最后端
int rflag = right;
int lflag = left;
while(true){
while(array[left]<standard)
left++;
while(array[right]>=standard&&right>lflag)
right–;
if(left>=right){
//与standard交换数据
array[rflag] = array[left];
array[left] = standard;
break;
}
//交换数据
int tmp = array[left];
array[left] = array[right];
array[right] = tmp;
}
return left;
}
代码分析:这次最主要的两个函数是recQuickSort 和 divide 。对于递归函数,最重要的是要先确定其基准情况,然后再描述非基准情况。 而对于divide函数,每次进行排序的是array数组的left–right区间。以该区间的右面一个数为基准情况进行二分类。
递归逻辑:《1》对array数组指定区间进行recQuickSort 排序 。 《2》若该区间元素大于1(非基准情况,right>left),进行divide分割为两部分 ,对分割的两部分分别进行步骤1。 《3》若该区间元素个数等于1(基准情况,left>=right),本次排序完成。
希望可以帮助你!