块排最重要的就是partition()操作,如果是普通的快速排序,暂且叫partition(),可以采用随机区标志位进行划分;双路快排就是出现=标志位很多时,进行的优化;三路快排就是解决=标志位很多的情况。
具体partition()函数如下:
template<typename T>
int __partion(T arr[],int l,int r)
{
int index=rand()%(r-l+1)+l;
swap(arr[l],arr[index]);
T temp=arr[l];
int j=l;
for(int i=l+1;i<=r;i++)
{
if(arr[i]<temp)
{
swap(arr[j+1],arr[i]);
j++;
}
}
swap(arr[l],arr[j]);
return j;
}
template<typename T> int __partion2(T arr[],int l,int r) { int index=rand()%(r-l+1)+l; swap(arr[l],arr[index]); T v=arr[l]; int i=l+1; int j=r; while(true) { while(i<=r&&arr[i]<=v) i++; while(j>l&&arr[j]>=v) j--; if(i<j) swap(arr[i++],arr[j--]); else break; } swap(arr[l],arr[j]); return j; }
三路快排就不写了,可以去看数据结构与算法。
其实排序算法中,到小范围的排序都可以采用插入排序,这也是一步优化。