快速排序的基本思想是基于分治策略的。对于输入的子序列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);
}