快速排序

前言

快速排序的基本思想是:通过一趟排序将待排的记录划分为独立的两部分,称为前半区和后半区,其中,前半区中记录的关键码均不大于后半区记录的关键码,然后再分别对这两部分记录继续进行快速排序,从而使整个序列有序。


一趟快速排序的过程称为一次划分,具体做法是:附设两个元素位置指示变量i和j,它们的初值分别指向待排序的第一个记录和最后一个记录。设枢轴记录(通常是第一个记录)的关键码为pivot,则首先从j所给位置起向前搜索,找到第一个关键码小于pivot的记录时停止,然后从i所给位置起向后搜索,找到第一个关键码大于pivot的记录时停止,此时交换j所给位置和i所给位置的元素,重复该过程直至i与j相等为止,完成一趟划分

一、【函数】快速排序过程中的划分

//用data[low]的值作为枢轴元素pivot进行划分
//使得data[low...i-1]均不大于pivot,data[i+1...high]均不小于pivot
int partition(int data[], int low, int high)
{
    int pivot = data[low];
    int i = low;
    int j = high;
    while(i < j)    //从数组的两端交替地向中间扫描
    {
        while(i < j && data[j] >= pivot) 
            j--;
        data[i] = data[j];    //比枢轴元素小者往前移
        while(i < j && data[i] <= pivot)
            i++;
        data[j] = data[i];    //比枢轴元素大者往后移
    }
    data[i] = pivot;
    return i;                //返回枢轴元素的位置
}

二、【函数】用快速排序方法对整型数组进行非递减排序

//用快速排序方法对数组元素data[low...high]进行非递减排序
void quickSort(int data[], int low, int high)
{
    if(low < high)
    {
        int loc = partition(data, low, high);    //进行划分
        quickSort(data, low, loc - 1);            //对前半区进行快速排序
        quickSort(data, loc + 1, high);         //对后半区进行快速排序
    }
}

 


总结

快速排序算法的时间复杂度为O(n{log_{2}}^{n}),在所有复杂度为此数量级的排序方法中,快速排序被认为是平均性能最好的一种。但是,当初始序列按关键码有序或基本有序时,即每次划分都是将序列划分为前半区(或后半区)不包含元素的情况,此时快速排序性能蜕化为时间复杂度为O(n^{^{2}})快速排序是不稳定的排序方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值