数据结构学习笔记之快速排序(非递归)

数据结构学习笔记之快速排序(非递归)

代码如下:

#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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值