10种经典排序算法包括冒泡排序、选择排序、快速排序、归并排序、堆排序、插入排序、希尔排序、计数排序、桶排序、基数排序等。
当然,还有一些其他的排序算法,大家可以继续去研究下。
01冒泡排序
冒泡排序(Bubble Sort)是一种比较简单的排序算法,它重复地走访过要排序的元素,依次比较相邻两个元素,如果它们的顺序错误就把他们调换过来,直到没有元素再需要交换,排序完成。
注:上图中,数字表示的是数据序列原始的索引号。
算法过程
- 比较相邻的元素,如果前一个比后一个大,就把它们两个对调位置。
- 对排序数组中每一对相邻元素做同样的工作,直到全部完成,此时最后的元素将会是本轮排序中最大的数。
- 对剩下的元素继续重复以上的步骤,直到没有任何一个元素需要比较。
冒泡排序每次找出一个最大的元素,因此需要遍历 n-1 次 (n为数据序列的长度)。
算法特点
什么时候最快(Best Cases):当输入的数据已经是正序时。
什么时候最慢(Worst Cases):当输入的数据是反序时。
Python代码
def bubble_sort(lst): n = len(lst) for i in range(n): for j in range(1, n - i): if lst[j - 1] > lst[j]: lst[j - 1], lst[j] = lst[j], lst[j - 1] return lst
02选择排序
选择排序原理
选择排序(Selection Sort)的原理,每一轮从待排序的记录中选出最小的元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。得到数值从小到达排序的数据序列。
也可以每一轮找出数值最大的元素,这样的话,排序完毕后的数组最终是从大到小排列。
选择排序每次选出最小(最大)的元素,因此需要遍历 n-1 次。
Python代码
def selection_sort(lst): for i in range(len(lst) - 1): min_index = i for j in range(i + 1, len(lst)): if lst[j] < lst[min_index]: min_index = j lst[i], lst[min_index] = lst[min_index], lst[i] return lst
03快速排序
快速排序(Quick Sort),是在上世纪60年代,由美国人东尼·霍尔提出的一种排序方法。这种排序方式,在当时已经是非常快的一种排序了。因此在命名上,才将之称为“快速排序”。
算法过程
- 先从数据序列中取出一个数作为基准数(baseline,习惯取第一个数)。
- 分区过程,将比基准数小的数全放到它的左边,大于或等于它的数全放到它的右边。
- 再对左右区间递归(recursive)重复第二步,直到各区间只有一个数。
因为数据序列之间的顺序都是固定的。最后将这些子序列一次组合起来,整体的排序就完成了。
如下图,对于数据序列,先取第一个数据 15为基准数,将比 15 小的数放在左边,比 15 大(大于或等于)的数放在右边
接下来,对于左边部分,重复上面的步骤,如下图,取左边序列的第一个数据 11 为基准数,将比 11 小的数放在左边,比 11 大(大于或等于)的数放在右边。
继续递归重复上述过程,直到每个区间只有一个数。这样就会完成排序
Python代码
def quick_sort(lst): n = len(lst) if n <= 1: return lst baseline = lst[0] left = [lst[i] for i in range(1, len(lst)) if lst[i] < baseline] right = [lst[i] for i in range(1, len(lst)) if lst[i] >= baseline] return quick_sort(left) + [baseline] + quick_sort(right)
还有更多的Python学习资料可以学习哦(已打包好,点击得取 ↓ )