1.思想就是递归的分而治之,每次递归就做两件事:分段,对这个段依照pivot进行粗略的排序
2.对于分好的段,求出其中位数为pivot,然后小于pivot的全都放到这个段的左边,大于pivot的全都放到这个段的右边,下面是实现代码
#include<stdio.h>
#include<stdlib.h>
template <typename T> class QuickSort
{
private:
void swap(T &a,T &b)//交换两个参数的值
{
T t;
t = a;
a = b;
b = t;
}
int medium3(T *data,int left,int right)//求出pivot,并且排序
{
int center = (left+right)/2;
if(data[left]>data[center])
swap(data[left],data[center]);
if(data[left]>data[right])
swap(data[left],data[right]);
if(data[center]>data[right])
swap(data[center],data[right]);
//data[center]为pivot
swap(data[center],data[right-1]);
return data[right-1];
}
void Qsort(T *data,int left,int right)
{
if(right-left<2) return; //递归结束
int pivot = medium3(data,left,right);//求出这个段的中位数
int i=left,j = right-1;
while(1)
{
while(data[++i]<pivot){
;
}
while(data[--j]>pivot){
;
}
if(i<j){
swap(data[i],data[j]);
}else{
break;
}
}
swap(data[i],data[right-1]);
Qsort(data,left,i-1);
Qsort(data,i+1,right);
}
public:
void Quicksort(T *data,int n)
{
Qsort(data,0,n-1);
}
};
int main()
{
int d[]={4,6,1,3,9,100,-90};/待排序的数组
QuickSort<int> qs;//创建快排模板类
qs.Quicksort(d,7);//调用排序成员函数
for(int i=0;i<7;i++)
printf("%d\t",d[i]);
return 0;
}