针对待排序数组中可能存在于相同元素过多问题,可以对partition函数以另一种方式书写,我们将其称为双路快速排序。
代码如下:
#include <iostream>
#include <algorithm>
#include <ctime>
using namespace std;
template <typename T>
int _partition(T arr[], int l, int r){
T v = arr[l];
int i = l+1, j = r;
while( true ){
while( i <= r && arr[i] < v )
i ++;
while( j >= l+1 && arr[j] > v )
j --;
if( i > j )
break;
swap( arr[i] , arr[j] );
i ++;
j --;
}
swap( arr[l] , arr[j]);
return j;
}
template <typename T>
void _quickSort(T arr[], int l, int r){
if( l >= r )
return;
int p = _partition(arr, l, r);
_quickSort(arr, l, p-1 );
_quickSort(arr, p+1, r);
}
template <typename T>
void quickSort(T arr[], int n){
srand(time(NULL));
_quickSort(arr, 0, n-1);
}
int main() {
int arr[] = {3,4,5,3,3,3,1,2};
quickSort(arr,8);
for(int i = 0; i<8; i++){
cout<<arr[i]<<" ";
}
cout<<endl;
return 0;
}
主要就是partition函数的改变,使得两棵子树相对比较平衡。