思想:将数组分为三个部分<v、==v、>v
e==v:i++
e<v:将元素和==v部分的第一个元素交换
e>v:将其和gt-1位置的元素交换,为>v块第一个元素
操作完成:i==gt
将l和lt交换位置
#include <iostream>
#include <algorithm>
#include <ctime>
using namespace std;
//三路快排
void quickSort(int arr[], int l,int r){
if(l>=r)
return;
//partition
//[l+1,lt]<v
//[lt,i]==v
//[gt,r]>v
int v=arr[l];
int lt=l;
int i=l+1;
int gt=r+1;
while(i<gt)
{
if(arr[i]==v)
i++;
else if(arr[i]>v)
{
gt--;
swap(arr[i],arr[gt]);
}
else
{
lt++;
swap(arr[i],arr[lt]);
i++;
}
}
swap(arr[l],arr[lt]);
int p=lt;
quickSort(arr,l,p-1);//<v部分做快排
quickSort(arr,p+1,r);//>v部分做快排
}
int main()
{
int a[10]= {5,8,7,9,6,3,4,1,2,0};
quickSort(a,0,9);
for(int i=0; i<10; i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
return 0;
}
这种算法在处理重复键值比较多的情况下,优势比较大