此篇文章与大家分享分治算法关于快速排序的专题
对于快速排序在我个人主页专栏 <排序> 有详细的介绍,此专题对快排进行了优化操作,并介绍了优化后的快排的几种运用
如果有不足的或者错误的请您指出!
1.颜色分类
题目:颜色分类
1.1解析
这道题目实际上就是将一个给定的只有0,1,2的数组,分成三块,0放在一起,1放在一起,2放在一起
回顾一下移动0问题,实则就是利用双指针将数组划分为两部分.本题也可以利用类似的思想,只不过是将数组划分为3部分
如图所示,我们标记好left和right,用i来遍历数组,那么这三个变量实际上就将数组划分为4个区间,而我们要做的就是在遍历数组的时候去维护三个区间就好了
(1)arr[i] == 0
为了维护0都在[0,left]这段区间,那么我们要让交换arr[++left]和arr[i],后i++继续遍历
(2)arr[i] == 1
为了维护1都在[left+1,i]这段区间,我们只需让i++即可
(3)arr[i] == 2
为了维护2都在[right,n-1(n为数组长度)],我们要让arr[–right]和arr[i]交换,但是此时i不能++,因为此时从[right,n-1]交换过来的元素还没判断
维护好这三个区间,当i与right相遇即可
class Solution {
public void sortColors(int[] arr) {
int left = -1;
int n = arr.length;
int right = n;
for(int i = 0; i < right; ){
if(arr[i] == 0){
swap(arr,i++,++left);
}else if(arr[i] == 1){
i++;
}else{
swap(arr,i,--right);
}
}
}
public void swap(int[] array,int i,int j){
int tmp = array[i];
array[i] = array[j];
array[j] = tmp;
}
}
2.利用数组划分实现快速排序
题目:数组排序
2.1解析
我们之前学过的快速排序是每次把数组划分为两部分,时间复杂度最好情况下为O(NlogN),但是如果出现大部分的相同元素,就会大大增加时间复杂度
在本题中,我们对之前学过的快速排序进行优化
(1)跟上一题颜色划分一样,在找定基准元素key后,我们把区间每次都分成三部分,
这样做的好处是,我们再次对不同区间进行递归的时候,就不必再考虑中间 == key 的部分了,因为中间都是相同的值,就没必要参与排序了
而分区域的思想在上一道颜色划分的题目已经讲过
实际上就是用i来遍历区间的时候,分三种情况:(推导过程在上一道题已经演示)</