第八章学习小结

一、主要内容

1、排序的稳定性:

假设Ki=Kj,i不等于j,且在排序前的序列中Ki是领先与Kj的。如果排序后Ki仍是领先于Kj的,则称所用的排序方法是稳定的;反之是不稳定的。

(1)不稳定排序:选择排序、快速排序、希尔排序、堆排序;

(2)稳定排序:冒泡排序、插入排序、归并排序、基数排序。

 

2、内排序与外排序:

根据在排序过程中,待排序的记录是否全部被放置在内存中,排序分为内排序和外排序。

内排序是在整个排序过程中,待排序的所有纪录全部被放置内存中。外排序是由于需要排序的纪录太多,不能同时放置在内存中,整个排序过程需要在内外存之间多次交换数据进行。

 

3、各个算法的思想:

(1)直接插入排序:

最基本的插入排序,将第i个插入到前i-1个中的适当位置。

(2)折半插入排序:

因为是已经确定了前部分是有序序列,所以在查找插入位置的时候可以用折半查找的方法进行查找,提高效率。

(3)希尔排序:

把待排序序列分成若干较小的子序列,然后逐个使用直接插入排序法排序,最后再对一个较为有序的序列进行一次排序,主要是为了减少移动的次数,提高效率。原理应该就是从无序到渐渐有序,要比直接从无序到有序移动的次数会少一些。

(4)冒泡排序:

反复扫描待排序序列,在扫描的过程中顺次比较相邻的两个元素的大小,若逆序就交换位置。第一趟,从第一个数据开始,比较相邻的两个数据,(以升序为例)如果大就交换,得到一个最大数据在末尾;然后进行第二趟,只扫描前n-1个元素,得到次大的放在倒数第二位。以此类推,最后得到升序序列。如果在扫描过程中,发现没有交换,说明已经排好序列,直接终止扫描。所以最多进行n-1趟扫描。

(5)简单选择排序:

第一趟时,从第一个记录开始,通过n – 1次关键字的比较,从n个记录中选出关键字最小的记录,并和第一个记录进行交换。第二趟从第二个记录开始,选择最小的和第二个记录交换。以此类推,直至全部排序完毕。

(6)快速排序:

冒泡排序一次只能消除一个逆序,为了能一次消除多个逆序,采用快速排序。以一个关键字为轴,从左从右依次与其进行对比,然后交换,第一趟结束后,可以把序列分为两个子序列,然后再分段进行快速排序,达到高效。

(7)堆排序:

把待排序记录的关键字存放在数组r[1…n]中,将r看成是一刻完全二叉树的顺序表示,每个节点表示一个记录,第一个记录r[1]作为二叉树的根,一下个记录r[2…n]依次逐层从左到右顺序排列,任意节点r[i]的左孩子是r[2i],右孩子是r[2i+1],双亲是r[i/2向下取整]。然后对这棵完全二叉树进行调整建堆。

(8)并归排序:

假设初始序列右n个记录,首先将这n个记录看成n个有序的子序列,每个子序列的长度为1,然后两两归并,得到n/2向上取整 个长度为2(n为奇数时,最后一个序列的长度为1)的有序子序列。在此基础上,在对长度为2的有序子序列进行两两归并,得到若干个长度为4的有序子序列。如此重复,直至得到一个长度为n的有序序列为止。

(9)基数排序:

先分配,再收集,就是先按照一个次关键字收集一下,然后进行收集(第一个排序),然后再换一个关键字把新序列分配一下,然后再收集起来,又完成一次排序,这样所有关键字分配收集完后,就完成了排序。

 

4、各个排序算法的比较:

 

 

 

 

二、心得与目标

其实这一章这么多排序方法,看起来有点混,但只要把原算法和改进算法放一起学的话,就好记很多。这一次的作业题比较简单,就是要注意数组长度是51,不然会出现段错误。最后的最后,这一学期真的要结束了啊,能被晓梅老师这样认真又超级负责讲课还特别好的老师教一学年真的很幸运啦,好想被老师带到毕业啊啊啊啊

posted @ 2020-07-12 01:34  杨璇  阅读(132)  评论(0编辑  收藏  举报