用 Python 实现十大经典排序算法

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年代,由美国人东尼·霍尔提出的一种排序方法。这种排序方式,在当时已经是非常快的一种排序了。因此在命名上,才将之称为“快速排序”。

算法过程

  1. 先从数据序列中取出一个数作为基准数(baseline,习惯取第一个数)。
  2. 分区过程,将比基准数小的数全放到它的左边,大于或等于它的数全放到它的右边。
  3. 再对左右区间递归(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学习资料可以学习哦(已打包好,点击得取 ↓ )

  • 22
    点赞
  • 220
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值