排序算法原理总结和Python实现

1 排序算法分类

比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。
非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间非比较类排序。
在这里插入图片描述

相关概念:

稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面。
不稳定:如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 b 的后面。
时间复杂度:对排序数据的总的操作次数。反映当n变化时,操作次数呈现什么规律。
空间复杂度:是指算法在计算机内执行时所需存储空间的度量,它也是数据规模n的函数。

排序算法原理和Python实现:

冒泡排序(Bubble Sort) – 初级排序算法
选择排序(Selection Sort)-- 初级排序算法
插入排序(Insertion-Sort)-- 初级排序算法

快速排序(Quick Sort)-- 高级排序算法
归并排序(Merge Sort)-- 高级排序算法
堆排序(Heapsort)-- 高级排序算法
希尔排序(Shell Sort)-- 高级排序算法

计数排序(Counting Sort)-- 特殊排序算法
桶排序(Bucket sort) – 特殊排序算法
基数排序(Radix Sort)-- 特殊排序算法

2 算法复杂度

在这里插入图片描述

3 排序算法的稳定性

稳定排序是指原来相等的两个元素前后相对位置在排序后依然不变。
不稳定算法:快选堆希(快速排序、选择排序、堆排序、希尔排序)
1、选择排序

选择排序是给每个位置选择当前元素最小的,比如给第一个位置选择最小的,在剩余元素里面给第二个元素选择第二小的,依次类推,直到第n - 1个元素,第n个元素不用选择了,因为只剩下它一个最大的元素了。那么,在一趟选择,如果当前元素比一个元素小,而该小的元素又出现在一个和当前元素相等的元素后面,那么交换后稳定性就被破坏了。比较拗口,举个例子,序列5 8 5 2 9,我们知道第一遍选择第1个元素5会和2交换,那么原序列中2个5的相对前后顺序就被破坏了,所以选择排序不是一个稳定的排序算法。

2、快速排序

快排的核心思想就是每次我选取一个基准,将小于这个基准的元素划分到左边,大于这个基准的元素划分到右边,然后将基准放在这两块的中间。快排是不稳定的。看下面这个简单的例子:
假设,当前的基准 5 ,我们已经成功的把小于 5 的元素划分到左半部分( 3,3,4,3),大于 5 的元素划分到了右半部份(8,9,10,11)。
[ 5 3 3 4 3 8 9 10 11 ]
此时我们将基准交换到两个部分的中间,方法就是将 5 与 左半部分最后一个元素 3 进行交换。到这里你就会发现,原来在后面的 3 现在跑到其它 3 的前面来了。

3、堆排序

我们知道堆的结构是节点 i 的孩子为 2 * i 和 2 * i + 1 节点,大顶堆要求父节点大于等于其 2 个子节点,小顶堆要求父节点小于等于其 2 个子节点。在一个长为 n 的序列,堆排序的过程是从第 n / 2 开始和其子节点共 3 个值选择最大(大顶堆)或者最小(小顶堆),这 3 个元素之间的选择当然不会破坏稳定性。但当为 n / 2 - 1, n / 2 - 2, … 1 这些个父节点选择元素时,就会破坏稳定性。有可能第 n / 2 个父节点交换把后面一个元素交换过去了,而第 n / 2 - 1个父节点把后面一个相同的元素没有交换,那么这 2 个相同的元素之间的稳定性就被破坏了。所以,堆排序不是稳定的排序算法

4、希尔排序

希尔排序是按照不同步长对元素进行插入排序,一次插入排序是稳定的,不会改变相同元素的相对顺序。但在不同的插入排序过程中,相同的元素可能在各自的插入排序中移动,最后其稳定性就会被打乱,所以希尔排序是不稳定的。

参考资料

十大经典排序算法(动图演示)
冒泡排序(Bubble Sort)
选择排序(Selection Sort)
插入排序(Insertion-Sort)
快速排序(Quick Sort)
归并排序(Merge Sort)
堆排序(Heapsort)
希尔排序(Shell Sort)
计数排序(Counting Sort)
桶排序(Bucket sort)
基数排序(Radix Sort)

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值