[开心IT面试题] 快速排序

1、基本思想

首先任意选择一个数据做为划分数组的参照数,将所有比参照数小的数移到它前面,将所有比参照数大的数移到它后面。然后再分别对参照数两边继续进行排序,以达到整个序列有效。

1)以第一个数组元素作为参照数、以left、right分别做为数组第一个数和最后一个数的标记。

2)从right位置开始向前找,找到第一个小于参照数的数,然后将此数赋给left位置。

3)从left位置开始向后找,找到第一个大于参照数的数,然后将此数赋给right位置。

4)重复2)、3)步骤,直到left=right。

5)按照1)、2)、3)、4)步骤不断缩小left、right值进行进行排序,直至left>=right排序结束。


2、在所有同数量级O(nlogn)的排序方法中,快速排序是性能最好的一种方法,在待排序列无序时最好。


3、快速排序是一种不稳定的排序。

最坏时间复杂度是O(n^2),最好时间复杂度O(nlogn),平均时间复杂度O(nlogn)。空间复杂度O(nlogn) 。


4、代码

将elem[]数组按递增进行快速排序

void QuickSort(int *elem, int left, int right)
{
    //对elem[left,right]快速排序
    if(elem == NULL || (left >= right))
    {
        return;
    }
    int referenceElem = elem[left];//划分数组的参照数
    int pos = left;//记录排序后参照数的位置
    int i = right;//i标记从right位置向前搜索的位置
    int j = left;//j标记从left位置向后搜索的位置
    while(i > j)
    {
        //从i位置开始向前搜索,找到第一个小于参照数的数,然后将此数赋给j位置
        for(; i > j; i--)
        {
            if(elem[i] < referenceElem)
            {
                elem[j] = elem[i];
                j++;
                pos = i;
                break;
            }
        }
        //从j位置开始向后搜索,找到第一个大于参照数的数,然后将此数赋给i位置
        for(; j < i; j++)
        {
            if(elem[j] > referenceElem)
            {
                elem[i] = elem[j];
                i--;
                pos = j;
                break;
            }
        }
    }
    elem[pos] = referenceElem;
    QuickSort(elem, left, pos-1);
    QuickSort(elem, pos+1, right);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值