【面试专题02】Python全栈日记-快速排序

快速排序,世界上公认的最快的排序方法,它每趟都能准确定位不止1个元素!当记录量很大的时候,而且杂乱无序时候,适合使用快速排序,因为每趟可以确定不止一个元素的位置,而且呈指数增加,所以特别快!学习快速排序,有很重要的意义,提高排序的速度,考虑算法的效率,做一个高效的程序员。

 

1、速排序思想

快速排序的思想:从待排序列中任取一个元素 (例如取第一个) 作为中心,所有比它小的元素一律前放,所有比它大的元素一律后放,形成左右两个子表;然后再对各子表重新选择中心元素并依此规则调整,直到每个子表的元素只剩一个。此时便为有序序列了。

 

 

2、速排序算法

我们知道了快速排序的思想,那么我们用一组数字直观的观察快速排序是如何进行工作的?

以关键字序列(256,301,751,129,937,863,742,694,076,438)为例,写出执行快速算法的各趟排序结束时,关键字序列的状态。

红色为中间数,绿色是已确定的数字,我们每趟下来都是对红色数字左右两边的列表再次进行排序操作。

 

分析上图取列表开头第一个数作为中间数,然后看列表最后一个数,如果最后一个数大于中间数,不动看倒数第二个数,依次类推。直到向前某个数(a),小于中间数,把这个数放在中间数本来的位置,也就是列表开头,然后从开头进行大小判断。

 

从头开始小于中间数的不动,大于中间数的放在之前小于中间数的那个数(a)的位子

 

也就是,满足条件的保持不动,不满足条件的挪走后,再从列表另一头进行判断。

 

等第一趟进行完毕,肯定会空出一个位置,把我们的中间数放在当前位置,这时中间数前面的小于中间数,中间数后面的大于中间数。中间数确定,

 

然后开始对中间数左边和右边分别进行这种排序,第二趟能确定最少2个新数,第三趟能确定最少4个,所以第n趟最少能确定2的n-1次方个.

 

 

因为刚学完js,用python实现快速排序后再用JavaScript实现一下,其实区别很小,就多了几个括号。

 

用python实现:

结果:

【1,2,3,4,5】
 

用JavaScript实现快速排序:

自2016年起推荐使用let代替var进行定义变量,let相当于是赋值一个局部变量,利于内存回收。

完整代码(http://note.youdao.com/noteshare?id=0be705a5b33fd0a7ca7b3278411b1937)

 

 

 

3、快速排序时间复杂度的分析

分析:设每个子表的支点都在中间(比较均衡),则:

第1趟比较,可以确定1个元素的位置;

第2趟比较(2个子表),可以再确定2个元素的位置;

第3趟比较(4个子表),可以再确定4个元素的位置;

第4趟比较(8个子表),可以再确定8个元素的位置;

         ……

只需log2n+1趟便可排好序。

 

而且,每趟需要比较和移动的元素也呈指数下降(最坏为n次),加上编程时使用了交替逼近技巧,更进一步减少了移动次数,所以速度特别快。

 

结论:

快速排序算法的时间复杂度:O(nlog2n)。

稳定性:不稳定排序,因为有不相邻元素之间的交换。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值