结合题目讲解“快速排序算法”

  理论很丰满,实战很骨感,作为一个嫌弃自己的胖子,我对实战很是热衷,导致总是对理论知识不上心,做题的时候就蒙了。

  比如有这样一道自考题:


  

  看完以后第一感觉就是翻书,因为觉得过了一遍书中知识点的情况下,做题的时候再仔细看看,然后推敲那些自己还没有掌握好的知识效果会更好,在这个过程中暴露了自己看书的一个很不好的习惯,就是知道把握全局,也知道要注重每个标题下边的初始知识介绍,但是总是莫名其妙地就一头扎进了书上的例题讲解中不能自拔,还傻傻地问自己为什么是这个样子,书上讲过吗?结果很是打脸,疑惑之处的解答基本上会在每个小标题下边那个“开门见山”的位置上,呵呵~~~在想以后是不是学习时候先看例题,再回去看书……

  书中对快速排序是这样介绍的:它是交换排序的一种,实质上是对冒泡排序的一种改进。基本思想:在n个记录中取某一个记录的键值作为基准(通常取第一个记录的键值作为基准)通过一趟排序,将待排序的记录分为小于或是等于这个键值和大于这个键值的两个独立部分,这时一部分的记录键值均比另一部分记录键值要小,然后,对这两部分记录继续分别进行快速排序,以达到整个序列有序。


  这道题的答案如下

  

  我在做题的时候发现只会第一趟排序,第二趟不知从何下手了,其实就是看书的时候没留意上文阐述的基本思想,后来终于搞明白了。下面是自己根据这道题,以及解题过程中出现的小失误,总结的解题分析,相当于是对书中基本思想的扩写吧(以升序排列为例):

  1、很废话,若是要求升序排列,比较之后调换位置就把小的放在左边,降序排列同理;
  2、第一趟排序的时候默认以第一个数为基准;


  3、简言之,就是一来一去:挑选完基准数据后,要注意的是,不是跟和它挨着的那个数开始往后依次比较,而是将这个待排序序列末端的数据选做比较对象,从末端开始往回比较,遇到比它小的直接交换位置,比如上题中的默认首位基准数据265,首先和末位的438比较,可知438比它大,那么就和438前边的数据比较,发现076比它小,于是,265就和076交换位置,此时,265的位置发生了改变,比较方向就需要发生改变了,期初它的比较对象是从后往前,经过这次交换后,它的比较对象的选择顺序就要变成从前往后,此时和它比较的是301,比它大,二者交换位置,依照上述方法继续接下来的工作,得到了第一趟的排序结果。


  4、注意一趟排序是由多次比较交换位置得到的,即看清一趟和一次
  5、通过观察答案所展示的排序过程我们会发现,基准是用来作为子序列的划分界限的,很像是分块,划分后,它的左边都是比它小的,右边都是比它大的,第一趟排序的基准是第一个数,第二趟排序的基准有两个,分别是每个子序列(用[]括起来的部分)的第一个数,他们各自负责自己所在块的排序,排序方法同序号3所述。
  6、在得到最后的排序结果之前,我们会发现待排序序列都在[]里边,基准都在外边,就像图中标注的那样,上一趟待排序子序列中的第一个数据会成为下一趟排序的基准。


  PS:上图中第四趟只有一个数据742是在[]中的了,我在做题的时候以为到第四趟就截止了,毕竟它只剩下一个待排序数字独立成为一个序列了,后来发现竟然还有第五趟,其实这不难理解,第五趟只是起到了一个确定作用,达到去除第四趟结果那个[]的作用。


  站在个人角度而言,这篇博客,叙述的貌似是快速排序方法,其实算是对自己学习方法的一个反思吧:

  (1)不要把全局观忘了,要注意看书的侧重点;

  (2)切忌眼高手低,不要觉得自己曾经接触过相关知识就觉得自己掌握得很好,从而可以绕开理论知识了,有些实战之前,还是需要巩固下理论知识的。




评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值