排序算法(4)——快速排序

[转载] 《算法导论》

1、快速排序的思想

通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
这里写图片描述

2、快速排序的实现

void swap(int *data1, int *data2)
{
    int tmp;
    tmp = *data1;
    *data1 = *data2;
    *data2 = tmp;
}

void QuickSort(int *array,int length)
{
    if (array == NULL || length < 2)
        return;
    int indexSmall = -1; //从前往后寻找
    int index=0;
    while (index < length-1)
    {
        if (array[index] < array[length - 1]) //参考元素选最后一个
        {
            indexSmall++;
            if (indexSmall != index)
                swap(array + indexSmall, array + index);
        }
        index++;
    }
    indexSmall++;
    swap(array + indexSmall, array + length - 1);

    QuickSort(array, indexSmall);
    QuickSort(array + indexSmall + 1, length - indexSmall - 1);

}

2、快速排序的性能

1)、时间复杂度
快速排序的时间主要耗费在划分操作上,对长度为k的区间进行划分,共需k-1次关键字的比较。

最坏情况是O(n^2)。当每次划分选取的基准都是当前无序区中关键字最小(或最大)的记录,划分的结果是基准左边的子区间为空(或右边的子区间为空),而划分所得的另一个非空的子区间中记录数目,仅仅比划分前的无序区中记录个数减少一个。

最好情况下O(nlgn)。当每次划分所取的基准都是当前无序区的”中值”记录,划分的结果是基准的左、右两个无序子区间的长度大致相等。总的关键字比较次数:

它的平均时间复杂度为O(nlgn)。尽管快速排序的最坏时间为O(n^2),但就平均性能而言,它是基于关键字比较的内部排序算法中速度最快者,快速排序亦因此而得名。

2)、稳定性
快速排序是不稳定的。

和其它层算法的比较:
快速排序和冒泡排序都是基于比较的排序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值