浅谈分治策略之快排篇

        分治策略排序有两种,一种是本文讲的快排,另外一种是归并排序。

        时间复杂度: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),本次排序完成。

希望可以帮助你!

    原文作者:递归与分治算法
    原文地址: https://blog.csdn.net/qq_37216252/article/details/80542372
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞