快速排序的基本思想是基于分治策略的。对于输入的子序列L[p..r],如果规模足够小则直接进行排序,否则分两步处理:
分解(Divide):将输入的序列L[p..r]划分成两个非空子序列L[p..q]和L[q+1..r],使L[p..q]中任一元素的值不大于L[q+1..r]中任一元素的值。
递归求解(Conquer):通过递归调用快速排序算法分别对L[p..q]和L[q+1..r]进行排序。
代码如下:
分解(Divide):将输入的序列L[p..r]划分成两个非空子序列L[p..q]和L[q+1..r],使L[p..q]中任一元素的值不大于L[q+1..r]中任一元素的值。
递归求解(Conquer):通过递归调用快速排序算法分别对L[p..q]和L[q+1..r]进行排序。
代码如下:
template<class T>
void Swap(T &a, T &b)
{
T t;
t = a;
a = b;
b = t;
}
int Median3(int a[], int start, int end)
{
int mid = (start+end)/2;
if(a[start]>a[mid])
Swap(a[start],a[mid]);
if(a[mid]>a[end])
Swap(a[mid], a[end]);
if(a[start]>a[mid])
Swap(a[start], a[mid]);
Swap(a[mid], a[end-1]);
return a[end-1];
}
void QuickSort(int a[], int start, int end)
{
static const int CUTOFF = 16;
if(end-start<CUTOFF)
{
InsertionSort(a, start, end);
return;
}
int m = Median3(a, start, end);
int i = start;
int j = end - 1;
while(true)
{
while(a[++i]<m);
while(a[--j]>m);
if(i<j)
Swap(a[i], a[j]);
else
break;
}
Swap(a[i], a[end-1]);
QuickSort(a, start, i-1);
QuickSort(a, i+1, end);
}
void Swap(T &a, T &b)
{
T t;
t = a;
a = b;
b = t;
}
int Median3(int a[], int start, int end)
{
int mid = (start+end)/2;
if(a[start]>a[mid])
Swap(a[start],a[mid]);
if(a[mid]>a[end])
Swap(a[mid], a[end]);
if(a[start]>a[mid])
Swap(a[start], a[mid]);
Swap(a[mid], a[end-1]);
return a[end-1];
}
void QuickSort(int a[], int start, int end)
{
static const int CUTOFF = 16;
if(end-start<CUTOFF)
{
InsertionSort(a, start, end);
return;
}
int m = Median3(a, start, end);
int i = start;
int j = end - 1;
while(true)
{
while(a[++i]<m);
while(a[--j]>m);
if(i<j)
Swap(a[i], a[j]);
else
break;
}
Swap(a[i], a[end-1]);
QuickSort(a, start, i-1);
QuickSort(a, i+1, end);
}