快速排序

快速排序在最优情况下,它的排序时间复杂度为O(nlog2n)。即每次划分序列时,能均匀分成两个子串。但最差情况下它的时间复杂度将是O(n*n)。

快速排序是种不稳定的排序方法。

速排序是找出一个元素(理论上可以随便找一个)作为基准,然后对数组进行分区操作,使基准左边元素的值都不大于基准值,基准右边的元素值 都不小于基准值,如此作为基准的元素调整到排序后的正确位置。递归快速排序,将其他n-1个元素也调整到排序后的正确位置。最后每个元素都是在排序后的正 确位置,排序完成。所以快速排序算法的核心算法是分区操作,即如何调整基准的位置以及调整返回基准的最终位置以便分治递归。

int partition(int* data, int start, int end)
{
    if( data == NULL || start >= end )
    {
        return 0;
    }

    int temp = data[start]; //把第一个数作为基准

    while(start < end)
    {
        while(start < end && data[end] > temp) //寻找比基数小的值
            --end;
        data[start] = data[end];

        while(start< end && data[start] < temp) //寻找比基数大的值
            ++start;
        data[end] = data[start];
    }
    data[start]= temp;
    return start;
}


void QuickSort(int* data,int start,int end)
{
    if( data == NULL || start < 0 || start >=end )
        return;


    int index = partition(data,start,end);
    
    QuickSort(data,start,index-1);
    QuickSort(data,index+1,end);
}
原文地址:https://www.cnblogs.com/neverleave/p/2951646.html