2021-05-25 数据结构排序专题【2】

继续继续,前面我们谈到了两种查找的方法。都很朴素而且理解起来并不困难。

回忆一下,当我们把查找的问题细分的时候,我们会遇到两种情况:无序的和有序的

有序是最理想的情况,可以采用的查找方式可以是顺序,也可以是二分,都能解决问题

当然我们遇到的大多数情况都是无序的,顺序查找能够解决问题。但如果对于一个稳定,且需要进行多次查找的表,我们想一劳永逸,使用二分查找的方法,降低工作总规模的话,我们自然会开始思考排序这个问题。

对于无序表,我们如何排序,这是这部分要思考的问题。

1.冒泡排序

最朴素的,如果我们要把一串大小不一的珍珠按从小到大排列,怎么排。不需要太多的思考,我们就会拿起第一颗珍珠,跟右边的珍珠比较,如果大,则交换位置。然后再以这个交换过的珍珠为起点,进行相同的重复操作。一共进行n-1趟比较,就能找出最大的珍珠放在右边

这时候,规模量减小为n-1,再重复上述操作n-1次,就能把整个列表排好序

代码实现:

我的:

我的优化:增加每次比较趟数的变量


修正:下图中第二个注释应该是:“每一趟需要passnum次相邻比较”

算法性能:

时间效率较差:

因为每个数据在找到最终位置之前需要进行多次对比和交换,其中大部分是无效的

但有一点优势:无需任何额外存储空间开销

性能改进:

可以尽量减少无效排序

通过监测每趟对比是否发生过交换,来判断排序是否已经完成

如果在某一趟对比中没有发生交换,说明列表已经排好序,可以提前结束算法

代码实现:


''需要记得的是,冒泡排序的每一趟就是通过比较把最大值摆放在最右端的过程,

所以不论研究什么,都需要等待一趟比较完成,才是有意义的。

我们需要记录在某一趟比较完成后,是否在这一趟比较中发生交换

如果发生了交换,说明列表还在无序状态,则进入下一趟比较

如果没有发生交换,说明列表已经排好序,不需要进行下一轮比对

'''

2.选择排序

进一步思考,在冒泡排序的基础上,能否更加优化。

冒泡排序基本分为两步,一是多趟交换,而是多次交换

多趟,前面我们讲到了可以通过记录是否发生了交换来减少无效趟次

多次交换,那么我们是不是可以减少交换的次数呢?其实我们只需要通过比较记录下每趟最大数的位置,然后再跟当前最后一位进行交换(slection),就已经把每一趟的交换次数降低到了一次。

代码实现:


你可能感兴趣的:(2021-05-25 数据结构排序专题【2】)