快速排序

原先对快速排序一直弄不清楚。后来不知道咋的,突然脑子一激灵,觉得快速排序也不很难。

下面是对快速排序的算法思想的理解:

 

假设一个幼稚园有20位小朋友,现在站成了一个纵队。老师的任务是,把小朋友按年龄从小到大按顺序排好。

前提是小朋友不参与任何的活动,只回答老师自己的年龄。所有的事情都需要老师自己完成。想想这老师怎么做?

 

比较算法:

1。先确定站在第一个位置的人。方法是 从第二个位置的小朋友开始,让它同第一个位置的小朋友比较年龄,如果第二个比第一个大,那么接着让第三个同第一个比较,如果第二个比第一个小,那么让第一个同第二个交换位置,即总是让最小的那个小朋友站在第一个位置,让后再让第一个同第三个比。还是谁小谁站第一个位置。这样,一直比较到第20个小朋友,就确定了谁是年纪最小的小朋友,让它站第一个位置。以后就不再管它了。因为他肯定是站在第一个位置了(谁让他年纪最小呢)

2。然后开始确定站在第二个位置的人,方法是从第三个位置的小朋友开始,让他同第二个位置的小朋友交换,谁小谁站第二的位置。然后第四个和第二个比,依此类推。。。最后,就能确定站在第二个位置的小朋友了。

3。依此类推,最后确定站在第20个位置的小朋友

 

这么叙述还是掺杂了很多编程的因素在里面,比如总是在同一个队列里比较,操作什么的。如果是现实中,可以再加一个 空位,还有另一个空纵队。 先让第一个人站在空位上,然后让每个人同它比较,谁小谁站这个空位。最后让这个人站到另一队的队首去。

 

冒泡算法:

1。先让第一,第二比较,大的站二个位置。再让第二,第三排,大的站第三个位置,再让第三,第四个比,大的站第四个位置,依此类推,即每次都把年纪最大的往后推,最后就把年纪最大的推到最后了,

2。还是让第一,第二比较,大的站二个位置。再让第二,第三排,大的站第三个位置,再让第三,第四个比,大的站第四个位置,依此类推,把年纪第二大的放在倒数第二的位置。(这次比较已经不用管最后的那个年纪最大的小朋友了)

3。依此类推,把所有小朋友排好序

 

快速排序算法:

基本思想: 采用某种方法,先把这20个人分成三组,中间一个人,然后他前边的人的年龄都比他小或者跟他一般大, 他后边的人的年龄都比他大或者跟他一般大。然后按照同样的方法,把前边那部分人在分成同样的三组, 后面那部分人也分成同样的三组,依此类推,直到细分到每个组只有一个人的时候,就全部按顺序分好了。

 

下面是方法的描述, 就是怎么把20个人分成 前 中 后 三组。 前边都小于等于中间的, 后边的都大于等于中间的。

1)可以考虑成这个20人的纵队中间有一条无形的分割线,分割线的位置就是中间那个小朋友的位置。 分割线的两边就是两个组。那怎么才能确定分割线的位置呢。 显然从中间直接划分一个是不行,因为我们不清楚分割线的位置。

2)既然要分成三组,就要选择中间值,也就是中间那个人的,然后才能依据它来分组。 这个可以怎么选都行,但选第一个往往是比较简单的。

3)我们假定分割线在第N个位置,分割线左边的是小年龄,分割线右边的是大年龄。然后我们选左边第一个人作为标准,让他喊:我6岁了,从最后一个人往前数,有比我小的没。

4)然后从最后一个人开始(也就是第20个),看看自己是不是比6岁小,一直往前,假如有个人比6岁小,那么这个6岁的小朋友就跟这个人交换位置,这样,小的跑到了左边,6岁的小朋友跑到了右边。

5)然后6岁的小朋友又喊,我6岁了,从刚才跟我交换的那个人前面往后数,有比我大的没。

6)假若有,再交换,然后6岁小朋友又在左边,即小人堆里了,然后再从大人堆里刚才那个跟他交换的那个人往前数,有比他小的,再交换。

7)直到从前往后和从后往前都只剩他一个人了,那就把20个人分成三组了。 这个6岁小朋友的位置就是分割线的位置。前面的人都比他小或者跟它一般大,后面的人都比他大或者跟他一般大。

 

 

注意点:

1)小朋友在特定时候只能处于特定的组内,要么在小人堆,要么在大人堆

2)小朋友只有在小人堆的时候(即自己在小人堆里占有一个位置),才能把一个大人堆里的人(只是暂时还站在大人堆里,其实本来应该在小人堆里的)交换到小人堆。即你只有自己的位置,跟你交换,才能把一个人的位置改变

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值