介绍
三路快速排序是在双路快速排序的基础上进一步优化,对于处理有大量重复元素的情况,有很大的优势。
算法思路
- 以升序为例,设定arr[l+1…low] < arr[l]
- arr[high…r] > arr[l]
- arr[low+1…l) == arr[l]
代码实现
#include<bits/stdc++.h>
#include<ctime>
using namespace std;
template<class T>
void _quickSort3(T arr[], int l, int r) {
if(l >= r)
return;
swap(arr[l], arr[rand()%(r-l+1) + l]);
int low = l; //arr[l+1...low] < arr[l]
int high = r+1; //arr[high...r] > arr[l]
int i = l+1; //arr[low+1...i) == arr[l]
while(i < high) {
if(arr[i] < arr[l]) {
swap(arr[++low], arr[i++]);
}
else if(arr[i] > arr[l]) {
swap(arr[--high], arr[i]);
}
else {
i++;
}
}
swap(arr[l], arr[low]);
//对arr[l...p-1]进行排序
_quickSort3(arr, l, low-1);
//对arr[p+1...r]进行排序
_quickSort3(arr, high, r);
}
template<class T>
void quickSort(T arr[], int n) {
srand(time(NULL));
//对arr[0...n-1]进行排序
_quickSort3(arr, 0, n-1);
}
int main(int argc, char const *argv[])
{
// 测试
int arr[10] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
quickSort(arr, 10);
for(int i = 0; i < 10; i++) {
printf("%d ", arr[i]);
}
return 0;
}
最后
- 由于博主水平有限,难免有疏漏之处,欢迎读者批评指正!