10种经典排序算法包括冒泡排序、选择排序、快速排序、归并排序、堆排序、插入排序、希尔排序、计数排序、桶排序、基数排序等。
当然,还有一些其他的排序算法,大家可以继续去研究下。
冒泡排序(BubbleSort)是一种比较简单的排序算法,它重复地走访过要排序的元素,依次比较相邻两个元素,如果它们的顺序错误就把他们调换过来,直到没有元素再需要交换,排序完成。
注:上图中,数字表示的是数据序列原始的索引号。
冒泡排序每次找出一个最大的元素,因此需要遍历n-1次(n为数据序列的长度)。
什么时候最快(BestCases):当输入的数据已经是正序时。
什么时候最慢(WorstCases):当输入的数据是反序时。
也可以每一轮找出数值最大的元素,这样的话,排序完毕后的数组最终是从大到小排列。
选择排序每次选出最小(最大)的元素,因此需要遍历n-1次。
主要两步(拆分,合并)
思路:假设我们有一个没有排好序的序列,那么我们首先使用拆分的方法将这个序列分割成一个个已经排好序的子序列(直到剩下一个元素)。然后再利用归并方法将一个个有序的子序列合并成排好序的序列。
对于数据序列[15,11,13,18,10],我们从首先从数据序列的中间位置开始拆分,中间位置的设置为
首次拆分如下:
第一次拆分后,依次对子序列进行拆分,拆分过程如下:
合并过程中,对于左右分区以及其子区间,递归使用合并方法。先从左边最小的子区间开始,对于每个区间,依次将最小的数据放在最左边,然后对右边区间也执行同样的操作。
合并过程的完整图示如下:
插入排序如同打扑克牌一样,每次将后面的牌插到前面已经排好序的牌中。
该算法分为四步,包括划分桶、数据入桶、桶内排序、数据合并。
这里详细介绍下桶的划分过程。
对于一个数值范围在10到49范围内的数组,我们取桶的大小为10(defaultBucketSize=10),则第一个桶的范围为10到20,第二个桶的数据范围是20到30,依次类推。最后,我们一共需要4个桶来放入数据。
对于下面这个数据序列,初始设定桶的大小为20(defaultBucketSize=20),经计算,一共需要4个桶来放入数据。
然后将原始数组按数值大小放入到对应的桶中,完成数据分组。
对于桶内的数据序列,这时可以用冒泡排序、选择排序等多种排序算法来对数据进行排序。这些算法,在之前的视频里已有介绍,大家可以去了解下。
这里,我选用冒泡排序来对桶内数据进行排序。
桶内排序完成后,将数据按桶的顺序进行合并,这样就得到所有数值排好序的数据序列了
基数排序适用于所有元素均为正整数的数组。
排序过程分为“分配”和“收集”。
排序过程中,将元素分层为多个关键码进行排序(一般按照数值的个位、十位、百位、……进行区分),多关键码排序按照从最主位关键码到最次位关键码或从最次位到最主位关键码的顺序逐次排序。
基数排序的方式可以采用最低位优先LSD(Leastsgnificantdigital)法或最高位优先MSD(Mostsgnificantdigital)法,LSD的排序方式由键值的最右边开始,而MSD则相反,由键值的最左边开始。
LSD的基数排序适用于位数小的数列,如果位数多的话,使用MSD的效率会比较好,MSD的方式恰与LSD相反,是由高位数为基底开始进行分配,其他的演算方式则都相同。
这里以最低位优先LSD为例。
先根据个位数的数值,在扫描数值时将它们分配至编号0到9的桶中,然后将桶子中的数值串接起来。
将这些桶子中的数值重新串接起来,成为新的序列,接着再进行一次分配,这次是根据十位数来分配。
如果排序的对象有三位数以上,则持续进行以上的动作直至最高位数为止。
对于这些排序算法的实现,代码其实并不是最主要的,重要的是需要去理解各种算法的基本思想、基本原理以及其内部的实现过程。
对于每种算法,用其他编程语言同样是可以去实现的。
并且,对于同一种算法,即使只用Python语言,也有多种不同的代码方式可以来实现,但其基本原理是一致的。
python怎么学习?python怎么入门?python在哪学?python怎么学才快?不用担心,这里为大家提供了python速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!