啊哈!算法第一章第三节---快速排序笔记

快速排序

冒泡排序空间上是节省了很多,但是时间复杂度达到了O(N*2),当数据很大时会费相当长的时间。桶排序时间很短,但是空间占用率又很大,有没有既不浪费时间又可以快一点的算法呢?有,就是快速排序。

快速排序用到的思想是“二分”。

它的重点和思路是找基准数,然后把比基准数小的放在它的左边,比基准数大的放在它的右边,然后再把左边的序列拿出来,再找一个基准数,把比他小的数放在左边,比它大的数放在右边,然后再分...直到一边的序列剩下两个数,排好后这两个数就归位了,然后这样所有数都能归位。

快速排序之所以快,是因为它的交换是跳跃性的。冒泡排序每次交换都是相邻的,所以时间花费要久一些。

 

 

接下来举个实际的例子看怎么具体实现:

一个序列6 1 2 7 9 3 4 5 10 8,首先选定基准数(通常选定第一个数)为6,这时用两个变量i,j分别指向这个序列的最左边和最右边。由于基准数设定的是最左边,所以从右边开始向左走,直到找到一个小于6的数停下来,接下来i一步步向右走,直到找到一个大于6的数停下来。

对于这个序列,j首先从8开始,向前走路过10走到5停下,然后i从6开始,向前走路过1,2走到7停下。将i和j所指向元素的值交换一下,则序列现在变成:6 1 2 5 9 3 4 7 10 8.

到此,第一次交换结束,j和i从它们现在所在的位置继续向前走。然后j继续向前走,前进1步到4停止,接着i向前走,走到9停止。将j和i所指向元素的值交换一下。则序列现在变成:6 1 2 5 4 3 9 7 10 8.

j继续向前走,到了3停止,i向前走,但是这时i和j指向了同一个元素。这说明这次的“探测”结束,将这个元素3和基准数6交换。则序列现在变成:3 1 2 5 4 6 9 7 10 8.

这时以基准数6为分界点,6左边的数都小于6,6右边的数都大于6.现在基准数6已经归位,此时我们已经将整个序列分成两个,左边的序列是“3 1 2 5 4”,右边的序列是“9 7 10 8”,接下来分别处理这两个序列,方法和第一个一样。最后的序列将变成两个数,判断交换后整个序列就排序完毕了。

 

至此排序全部结束。我们发现,每一轮处理就是把这轮的基准数归位,当所有数都归位后,整个序列也就排序完成了。

看一下怎么写代码:

(这里书上写的只针对一个数组,在写快速排序函数的时候没有传入序列地址)

 

转载于:https://www.cnblogs.com/Aimee-S/p/6098844.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值