快速排序算法

//核心思路: 

//1. 取数组第一个元素作为基准值(iKey),执行一趟排序,让基准值左边的值都比基准值小,右边的值都比基准值大。然后递归重复执行。

//2. 先从右边开始,查找比基准值小的数,替换掉基准值所在的位置(a[i]),操作一次;再从左边开始,查找比基准值大的数,替换掉刚才右边查找的值(a[j])。 然后再从右边查找比基准值小的数,替换a[i],如此不断重复,直至i >= j后退出。i就是基准值(iKey)的最终位置,赋值。 这时就执行完一趟排序。

//3. 刚才基准值左边部分数组,递归执行一遍上面2的操作,基准值右边部分数组,也递归执行一遍。刚才的基准值不参与进下一次的排序。

//4. 完成之后,快速排序就完成了。

//5. 补充说明,需要对源数据做随机打乱处理,否则极端数据会导致时间复杂度退化为O(n平方),具体实现方式不做说明,可查看letcode 912. 排序数组

//=======================================================================================

void MyFastSort(int a[], int iMinIndex, int iMaxIndex, int iLen)
{
    if (iMinIndex >= iMaxIndex) //左边索引和右边索引相遇后,退出
        return;
    if (iMinIndex < 0 || iMinIndex >= iLen) //冗错判断
        return;
    
    int i = iMinIndex;
    int j = iMaxIndex;
    int iKey = a[iMinIndex];  //取最左边作为基准值

    while(i < j)
    {
        while(iKey <= a[j] && i < j)
            j--;//从右边开始查找,小于基准值的数
        a[i] = a[j]; //替换掉基准值所在的位置

        while(iKey >= a[i] && i < j) 
            i++;  //从左边开始查找,大于基准值的数
        a[j] = a[i];  //替换掉前面查出的数的所在的位置
    }
    a[i] = iKey; //确定基准值应该在哪

    MyFastSort(a, iMinIndex, i - 1, iLen); //左半部分做同样的递归处理,不包含基准值
    MyFastSort(a, i + 1, iMaxIndex, iLen); //右半部分做同样的递归处理,不包含基准值
}

int _tmain(int argc, _TCHAR* argv[])
{
    int a[] = {57, 68, 59, 52, 72, 28, 96, 33, 24};
    int iLen = sizeof(a) / sizeof(a[0]);
    MyFastSort(a, 0, iLen - 1, iLen);

    for(int i = 0; i < sizeof(a) / sizeof(a[0]); i++)
    {
        cout << a[i] << ", ";
    }

    return 0;
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值