void QSort(int * a,int begin,int end)
{
if(begin < end)
{
int i = begin;
int j = end+1; //关键
int k = a[i],tmp;
while(i < j) //
{
i = i + 1;
while(a[i] < k)
i ++;
j = j - 1;
while(a[j] > k)
j --;
if(i < j)
{
tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
}
tmp = a[begin]; //注意此时a[begin] 与 a[j] 交换
a[begin] = a[j];
a[j] = tmp;
QSort(a,begin,j - 1);
QSort(a,j + 1,end);
}
}
上是最简单的快速排序版本
/*
插入排序
*/
void insertSort(int * a,int begin,int end)
{
int tmp;
for(int j = begin + 1;j<= end;j++)
{
tmp = a[j];
int i = j -1;
//while(a[i] < a[j]) //不能这么写,因为a[i] 会被覆盖掉,此时的a[i]已不是彼时的a[i]
while(tmp < a[i])
{
a[i + 1] = a[i];
i --;
}
a[i + 1] = tmp;
}
}
/*
这个算法来自sgi stl
*/
int middle(int a,int b,int c)
{
if(a < b) //其实就是在这个大的条件下,依次return b ,c a
{
if(b < c) // a < b < c
return b;
else if(a < c) // a < b ; b > = c ; a < c
return c;
else // a < b ; a >= c
return a;
}
else {
if(b > c) // a > b > c
return b;
else if(a > c) // a > b ;b <= c;
return c;
else // a > b ; a < c
return a;
}
}
/*
首先,分划元素k 取得是a[begin],a[middel],a[end]的中值
其次,如果分得的子数组长度小于等于3,则调用insertSort
*/
void AdvancedQSort(int * a,int begin,int end)
{
if(begin >= end)
return ;
if(end - begin <= 3)
insertSort(a,begin,end);
else
{
int i = begin,j = end,k = middle(a[i],a[j],a[(i + i) / 2]),tmp;
while(i < j) //
{
i = i + 1;
while(a[i] < k)
i ++;
j = j - 1;
while(a[j] > k)
j --;
if(i < j)
{
tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
}
tmp = a[begin]; //注意此时a[begin] 与 a[j] 交换
a[begin] = a[j];
a[j] = tmp;
AdvancedQSort(a,begin,j - 1);
AdvancedQSort(a,j + 1,end);
}
}
本文介绍了基本的快速排序算法实现,并在此基础上提出了优化版本——高级快速排序。通过选取中间值作为枢轴并结合插入排序来提高排序效率。

被折叠的 条评论
为什么被折叠?



