快速排序 c++_归并排序与快速排序

e68d27f5a8d9059e0e454e5b2bf4e85c.png

     你是否还在为数据太难处理而苦恼?不用担心,本期专业资讯将为你带来两种性能优秀的排序算法——归并排序与快速排序,带你走进算法的世界。

725e4a39bc8cf4eb2aed5630e675e984.gif a74b71369bf1853afd7f469a8368549d.png

归并排序&快速排序

归并排序

归并排序:利用分治的思想,先排左边一半,再排右边一半,最后再将两边有序的合并起来。

时间复杂度: 用T(n)表示排大小为n的数组的时间

例题:T ( n ) = 2 T ( n / 2 ) + n T ( 1 ) 

关于如何解这个递归方程,这里介绍其中一种方法,

步骤1、我们假设n是2的幂

步骤2、递推关系式的两边同时除以n,得到:

979e2a6819182b127490681352a6216c.png

      因为该方程对2的幂的任意n是成立的,于是还可以写成:

8706db6fc55a7b5e66d3860e366ed592.png

步骤3、此时,我们把这些式子的左边和右边统一加起来,会发现很多项都同时消掉了,我们称之为叠缩公式。最后剩下:

184951b465ae45066067f01b869cf6a9.png 6850c7418bfc74f81664655aac7e3f65.png

快速排序

01

 快速排序的主要思想依然是分治: 

1、从待排数组中选出一个枢纽元(pivot)。

2、然后将数组分割为两个不相交集合s1 、s2,左半边集合的元素都小于等于pivot,右半边集合元素都大于等于pivot。

3、最后,分别排序左半边、右半边。

02

快速排序的枢纽元选择策略一般为:

1、三数中值分割法:即选择待排数组的左段、右段和中心位置的中值作为枢纽元。

2、待排数组的第一个元素:但是这很可能会出现极坏的情况——这个元素是这个数组里面最小的或者最大的,那么其他剩余元素要么被分进s1,要么被分进s2, TC:O(n^2)。这种最坏的情况出现在整个数组是预排序的(非递增、非递减)。

03

时间复杂度的关系为

897245747dc509be00207a863fa0f888.png

(i为集合s1中的元素个数,分割数组也需要线性时间).

那么先来分析下快速排序的最好情况:分割完数组后,集合s1 , s2中元素大小都一样。即:

5c7873c071ac32f67f48176d7f560a00.png

那么答案和刚才分析的归并排序是一样的,等式两边同时除以n,然后利用缩叠公式,最后得到

f894f494039c42751d4a093907295be7.png

然后对于前面提到的“可能出现的最坏情况”(即每次除了枢纽元之外的元素全在s1或s2):T(n)=T(n-1)+cn。

我们用n-1不断替换n可以得到:

T(n-1)=T(n-2)+c(n-1),T(n-2)=T(n-3)+c(n-3)...T(2)=T(1)+c(2)

依然是等式左右两边同时相加,

得到:T ( n ) = c ( 2 + 3 + . . . + n ) ,T(n)=O(n^2)。

最后,对于平均情况,因为对于s1,每个大小都是等可能的,所以都有1/n的可能:

6b649fe6e6bdae22a26566ce19d68862.png 59ca3643e1cdb40099f070b3814a92b3.png

       好了,以上就是我们本期专业资讯带来的两种排序算法。同学们,你们学会了吗?

115b4fff88ca2b4f6ee101e85b930e80.png 52357f2b-4537-eb11-8da9-e4434bdf6706.svg

 推荐阅读

No.1 ||  学习之星胡溢洋

No.2 ||  我院成功举办第十四届团支部风采大赛

No.3 ||  我院学生在“蓝桥杯”比赛中获佳绩

No.4 ||  我院成功举办第二届算法竞赛

No.5 ||  以篮球之名,展数计风采

a66a4d7225898c6c0932996ee9e97d4b.gif

武汉轻工大学数学与计算机学院

--whpu sjxy--

材料来源:算法协会

图文编辑:朱加骏

审核编辑:孙晓媛

审核老师:张俊

投稿邮箱:1870285752@qq.com

524b7e4078f7d7213bf56039cfca1e44.png

心慕数计久

惟愿此间留

扫码关注我们

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值