算法导论之快排

算法导论第七章是快速排序,很多公司面试得时候都可能会要求你手写快排。
并且主要分析一下快排的时间效率O(nlogn),分析这一块我以后看懂了会慢慢补上,今天终于自己可以手写一个快排的算法了。几天前别人问我的时候,我只是知道意思,却手写不出来,现在说明还是有点进步的。

如果是递归式,那就无法避免需要仔细研读分支策略了。目前来看吗,还是进度为重。

T(n) = 2*T(n/2) + O(n) = O(n*lgn)(每一层都平衡划分情况下)


快排的核心:就是找到数组中的一个数,做为基准,遍历数组除基准外的数,若此数比基准小,则放在基准前面,若大,则放在基准后面。


代码实现:
这是头文件部分。

class Quicksort
{
public:
    void quicsort(vector<int>&arr,int start,int end)
    {
        if (start < end)//保护条件,只有满足小的时候再开始排序
        {           
            int q = partion(arr,start,end); //找到一个基准,并排好序了
            quicsort(arr, start, q - 1);    //对基准前面部分继续快排
            quicsort(arr, q + 1, end);     //对基准后半部分继续快排
        }       
    }
    void sprint(vector<int>&arr)
    {
        for (int i = 0; i < arr.size(); i++)
        {
            cout << arr[i] << " ";
        }
        cout << endl;

    }

private:
    int partion(vector<int>&arr, int start, int end)
    {
            auto val = arr[end];  //把数组最后一个数作为基准
            int i = start, j = start;
            for (; j < end; j++)    //遍历除基准之外的数
            {
                if (arr[j] < val)        //若小,则换到数组前面去
                {
                    swap(arr[i++], arr[j]);  。。内置交换函数,我之前都是自己写的一个函数。
                }
            }
            swap(arr[i], arr[end]);  //遍历完之后,将i位置上的数和最后一个数交换。即基准就归位了。
            return i;   //返回基准的下标
    }
};

测试代码:

int main()
{
    vector<int> arr = { 1,12,32,5,4 };
    cout << "排序前数组" << endl;
    Quicksort s;
    s.sprint(arr);
    s.quicsort(arr, 0, arr.size()-1);
    cout << "排序后数组" << endl;
    s.sprint(arr);
    system("pause");
    return 0;
}

分析时间复杂度:
1、最坏情况(数组有序):
每次分割的时候,返回的总是第一个数。
这样每次递归的时候还需要递归只少了一个数的右子数组。
如下图:
算法导论之快排_第1张图片

算法导论之快排_第2张图片
算法导论之快排_第3张图片
算法导论之快排_第4张图片
算法导论之快排_第5张图片
这里写图片描述

你可能感兴趣的:(算法导论之快排)