算法排序3:优化版快速排序非递归实现快速排序
Posted 一只当归
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法排序3:优化版快速排序非递归实现快速排序相关的知识,希望对你有一定的参考价值。
快速排序整体的综合性能和使用场景都是较好的,但在有序的情况下快速排序反倒会变得慢起来,这时使用三数取中法可以把有序这种最坏情况变成最优解,实现快速排序的优化。
int GetMidIndex(int* a, int begin, int end)
{
int mid = (begin + end) >> 1; //采用移位的方式除二
if (a[begin] < a[mid])
{
if (a[mid] < a[end])
{
return mid;
}
else if (a[begin] < a[end])
{
return end;
}
else{
return begin;
}
}
else if (a[begin] > a[mid])
{
if (a[mid] > a[end])
{
return mid;
}
else if (a[begin] < a[mid])
{
return begin;
}
else{
return end;
}
}
}
int PrevCurMethod(int* a, int begin, int end) //前后指针实现单趟排序
{
int midindex = GetMidIndex(a, begin, end);
Swap(&a[midindex], &a[end]);
int prev = begin - 1;
int cur = begin;
int key = a[end];
while (cur < end) //遇到key就结束了
{
if (a[cur] < key && ++prev != cur)
{
Swap(&a[prev], &a[cur]);
}
++cur;
}
++prev;
Swap(&a[prev], &a[end]);
return prev;
}
int QuickSort(int* a, int begin, int end) //应用递归的思想
{
if (begin >= end)
return;
int keyindex = PrevCurMethod(a, begin, end); //使用前后指针
QuickSort(a, begin, keyindex - 1);
QuickSort(a, keyindex + 1, end);
}
同样的,在一些特殊情况下我们还可以使用非递归来实现快速排序,非递归实现快速排序的重点就是使用数据结构的栈来模拟递归。
void QuickSortNonR(int* a, int begin, int end)
{
Stack st;
StackInit(&st);
StackPush(&st, begin);
StackPush(&st, end);
while (!StackEmpty(&st))
{
int right = StackTop(&st);
StackPop(&st);
int left = StackTop(&st);
StackPop(&st);
int keyindex = PrevCurMethod(a, left, right);
if (left < keyindex-1)
{
StackPush(&st, left);
StackPush(&st,keyindex-1);
}
if (keyindex+1 < right)
{
StackPush(&st, keyindex+1);
StackPush(&st,right);
}
}
StackDestroy(&st);
}
以上是关于算法排序3:优化版快速排序非递归实现快速排序的主要内容,如果未能解决你的问题,请参考以下文章