首发于 【力扣——基础算法】
leetcode系列——基础算法之快速排序

leetcode系列——基础算法之快速排序

注:本系列只作为学习记录,有任何疑问请友善私聊。

排序算法相对比较简单,这里我只记录快速排序,原因是后面会用到,而且经常在面试中被问到。快速排序是一种递归排序,简单又快。

1.原理简介

一个列表中含有若干个数,要将它变成有序数列(升序或者降序),我们可以思考这样一种方式:以列表中的任意一个数A为基准,大于A则放到A的右边,小于A则放到左边;然后得到一左一右两个子列表,并被A分开,此时分别对左右列表再进行上面的操作,直到不可再分,所有分完之后,再从后往前合并。

啥意思呢?

第一步:选定一个列表中的一个数A,将其余的数与A比较,大的放到右边,小的放到左边
第二步:对左、右两边的子序列分别进行第一步的操作,直到不能再分
第三步:把每一步分好的组按照“左边(小的数)+基准+右边(大的数)合并起来,合并顺序为从最后一步划分开始到第一步划分结束

侵删

下面一步步地划分:

Step1.对2——3——1再进行划分,比如选2作为基准,变成1——2——3,不可再分
Step2.对6——5——7——8划分,比如选7,顺序不变
Step3.对2中选6,变成5——6——7——8
Step4.对3中的7——8划分,比如选7,变成7——8

现在划分完后,再从Step4到Step1合并,按照”左+基准+右“的原则

Merge1:7——8
Merge2:5——6——7——8
Merge3:1——2——3
Merge4:1——2——3——4——5——6——7——8

1、下面给出python代码:

注意:在函数返回时,基准值必须以列表的形式合并,否则报错:

正确运行结果:

快速排序顾名思义,就是快,时间复杂度在最好的情况下是 O(nLogn) ,最差的情况是 O(n^2) ,在面试中常被问到。

在上面的代码中,选择了第一个数作为基准,这是比较常用的。

其他还有很多的排序方法,比如经典的冒泡法、插入法、选择法、计数法等,这里不写了,有需要可以以后再写。

比如

参考资料:

《图解LeetCode初级算法(Python版)》——胡松涛

2、C++实现

快速排序:

class Solution {
public:
    void sort(vector<int>& nums, int left, int right) 
    {
        if (left > right)
        {
            return;
        }
        int L = left;
        int R = right;
        int flag = (left+right)/2;
        swap(nums[flag],nums[left]);
        int base = nums[left];
        while (L < R)
        {
            while(base<=nums[R] && L < R)
            {
                R--;
            }
            while(base>=nums[L] && L < R)
            {
                L++;
            }
            if(L<R)
            {
                swap(nums[R],nums[L]);
            }
        }

        nums[left] = nums[L];
        nums[L] = base;

        sort(nums, left, L-1);
        sort(nums, L+1, right);
    }
    vector<int> sortArray(vector<int>& nums) 
    {
        int left = 0;
        int right = nums.size() - 1;
        sort(nums, left, right);
        return nums;
    }
};

归并排序:

class Solution {
    void merge(vector<int>& nums,int left,int right,vector<int>& ans)
    {
        int mid=(right-left)/2+left;
        int i=left,j=mid+1,k=0;
        while(i<=mid&&j<=right)
        {
            if(nums[i]<=nums[j])
                ans[k++]=nums[i++];
            else ans[k++]=nums[j++];
        }
        while(i<=mid)
        {
            ans[k++]=nums[i++];
        }
        while(j<=right)
            ans[k++]=nums[j++];
        for(int i=left;i<=right;i++)
            nums[i]=ans[i-left];
    }
    void mergeSort(vector<int>& nums,int left,int right,vector<int>& ans)
    {
        if(left>=right)
            return ;
        int mid=(right-left)/2+left;
        mergeSort(nums,left,mid,ans);
        mergeSort(nums,mid+1,right,ans);
        merge(nums,left,right,ans);
    }
public:
    vector<int> sortArray(vector<int>& nums) {
        vector <int> ans(nums.size());
        mergeSort(nums,0,nums.size()-1,ans);
        return nums;
    }
};

//作者:DevinLi
//链接:https://leetcode-cn.com/problems/sort-an-array/solution/shi-da-pai-xu-suan-fa-c-by-devinli-gizk/
//来源:力扣(LeetCode)

代做工资流水公司开封对公银行流水模板惠州银行流水电子版查询九江房贷收入证明样本银川对公银行流水图片赣州房贷收入证明制作泰安工资流水单代做济宁贷款流水多少钱深圳打印工资流水单杭州查企业贷流水宁波工作收入证明代办合肥入职工资流水办理湛江查入职工资流水太原对公银行流水办理菏泽企业对公流水模板湛江做工资银行流水成都工资证明制作孝感查薪资银行流水吉林银行流水账单威海日常消费流水代办北京代开房贷工资流水南宁车贷流水图片阜阳制作公司流水泉州转账银行流水模板惠州打签证流水潍坊背调工资流水代办桂林企业贷流水代做合肥开公司银行流水江门办理签证流水海口打印转账流水南昌代办对公账户流水香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声卫健委通报少年有偿捐血浆16次猝死汪小菲曝离婚始末何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言男子被猫抓伤后确诊“猫抓病”周杰伦一审败诉网易中国拥有亿元资产的家庭达13.3万户315晚会后胖东来又人满为患了高校汽车撞人致3死16伤 司机系学生张家界的山上“长”满了韩国人?张立群任西安交通大学校长手机成瘾是影响睡眠质量重要因素网友洛杉矶偶遇贾玲“重生之我在北大当嫡校长”单亲妈妈陷入热恋 14岁儿子报警倪萍分享减重40斤方法杨倩无缘巴黎奥运考生莫言也上北大硕士复试名单了许家印被限制高消费奥巴马现身唐宁街 黑色着装引猜测专访95后高颜值猪保姆男孩8年未见母亲被告知被遗忘七年后宇文玥被薅头发捞上岸郑州一火锅店爆改成麻辣烫店西双版纳热带植物园回应蜉蝣大爆发沉迷短剧的人就像掉进了杀猪盘当地回应沈阳致3死车祸车主疑毒驾开除党籍5年后 原水城县长再被查凯特王妃现身!外出购物视频曝光初中生遭15人围殴自卫刺伤3人判无罪事业单位女子向同事水杯投不明物质男子被流浪猫绊倒 投喂者赔24万外国人感慨凌晨的中国很安全路边卖淀粉肠阿姨主动出示声明书胖东来员工每周单休无小长假王树国卸任西安交大校长 师生送别小米汽车超级工厂正式揭幕黑马情侣提车了妈妈回应孩子在校撞护栏坠楼校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变老人退休金被冒领16年 金额超20万西藏招商引资投资者子女可当地高考特朗普无法缴纳4.54亿美元罚金浙江一高校内汽车冲撞行人 多人受伤

代做工资流水公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化