数据结构学习笔记之快速排序(非递归)
代码如下:
#include<assert.h>
#include<memory.h>
//快速排序(升序)
void QuickSort(int *a, int size)
{
int *low, *high, up, down, temp, counter, len;
len = (size - 1) * 2;//上下限数组长度
low = new int[len];//待排序数组的下限数组
high = new int[len];//待排序数组的上限数组
assert(low != 0);//断言low不为空
assert(high != 0);//断言high不为空
memset(low, 0, sizeof(int)*len);//初始化为0
memset(high, 0, sizeof(int)*len);//初始化为0
high[0] = size - 1;//初始上限为数组最后一个元素的下标
counter = 0;//计数器:计算排序过程中产生的上下限组数
for (int i = 0; i < len; i++)//遍历上下限数组
{
if (high[i] > low[i])//如果上限大于下限,则需要排序
{
up = low[i];
down = high[i];
temp = a[up];//选取下限所对应的元素为基准值
while (up != down)
{
while (up != down)
{
if (a[down] < temp)//如果数组后面的元素a[down]比基准值小,则把该元素搬到数组前面的空位,并且退出while循环
{
a[up] = a[down];
break;
}
else{
down--;//如果数组后面的元素a[down]大于或等于基准值,则继续向前寻找比基准值小的元素
}
}//while
while (up != down)
{
if (a[up] > temp)//如果数组前面的元素a[uo]比基准值大,则把该元素搬到数组后面的空位,并且退出while循环
{
a[down] = a[up];
break;
}
else{
up++;//如果数组前面面的元素a[up]小于或等于基准值,则继续向后寻找比基准值大的元素
}
}//while
}//while
a[up] = temp;//此时up等于down,该位置为基准值最终排序位置
low[++counter] = low[i];//基准值左边待排序数组下限
high[counter] = up - 1;//基准值左边待排序数组上限
low[++counter] = up+1;//基准值右边待排序数组下限
high[counter] = high[i];//基准值右边待排序数组上限
}//if
}//for
//释放动态分配的数组空间
delete[]low;
delete[]high;
}