算法与数据结构之排序

在本文中我们将逐一介绍算法与数据结构这门课中常见的一些排序算法,并给出一些相关考试题目的解答。

排序的定义

排序 是指将一组数据(例如一个数组或列表)按照某种特定的顺序(升序或降序)重新排列的过程。排序的依据通常是数据元素的某个关键码,比如数字的大小、字符串的字典序等。

总之,排序就是一个混乱->有序 的过程, 这显然与熵增趋势相逆,也就意味着需要外部能量或干预来实现,那么对于排序算法而言就是需要更高的时间复杂度和空间复杂度。

毕竟,将一个数组随机打乱顺序(shuffle)的算法其时间复杂度只需O(n),而将它排序好的时间复杂度则在O(n)~O(nlogn)~O(n^2)。这里出现O(n)的时间复杂度,那是你的运气爆棚,随机打乱的结果和有序时的结果一致,对于某些优化的排序算法而言,对有序数据排序,比如冒泡排序,时间复杂度是完全可以达到O(n)的。

shuffle操作

这里我们可以给出一个示例来看一下具体操作:

python 复制代码
import random
'''随机打乱一个数组内数字的顺序'''
def shuffle(arr):
    for i in range(len(arr)-1,0,-1):#从最后一个元素开始
        j=random.randrange(0, i+1)#随机选择0到i之间的索引,randrage函数时间复杂度O(1)
        arr[i], arr[j] = arr[j], arr[i] #任意交换 i与j
    return arr
arr=[1,2,3,4,5,6]
arr=shuffle(arr)
print(arr)

random.randrange函数:

random.randrange函数时间复杂度为O(1),其内部不涉及任何循环操作,只是简单的逻辑判断与数字运算。

当然也完全可以使用random.shuffle函数代替上述操作,显然,其时间复杂度也是O(n)。

排序的分类

给事物分类是人类的天性,是理解和掌握复杂事物的有效手段,也是当下AI模型的核心算法,对于排序算法而言,通常有以下几个标准来进行分类:

  1. 是否依赖元素间的比较操作:比较类排序和非比较类排序。
  2. 排序过程中数据的存储环境:内部排序与外部排序。
  3. 排序的稳定性:稳定的排序算法与不稳定的排序算法。
  4. 排序过程中的具体操作:基于插入,基于选择,基于交换等。

千言万语都不如一张图来的直观,这里直接看图即可:

排序分类图

排序算法的稳定性

排序算法的稳定性是指经过排序后,能使关键字相同的元素保持原顺序中的绝对位置不变。

也就是说,只有待排序的序列中具有相同的关键字时,我们才会考虑稳定性。理解稳定性的定义并不难,我们看几组图对比就明白了。

注意,排序前序列中有两个4,为了区分它们,我们用4*表示其中的一个,并且4在4*之前。

我们使用一个排序算法对上述序列进行排序,在排序后。如果相同的元素还能够保持排序前的相对顺序,也就是4在4*之前,那么这个排序算法就是稳定的。

相反,排序后,如果相同的元素无法保持排序前的相对顺序,也就是4*出现在了4之前,那么这个排序算法就是不稳定的。

关于算法与数据结构中所有排序算法的稳定性,只需要一句话即可完整记忆:

基于选择实现的排序算法都不稳定,实现起来较为复杂的排序算法,希尔排序和快速排序不稳定。ps:快速排序和堆排序可以通过特殊实现变为稳定,但标准/经典实现不稳定。

有的人可能会说,稳定性这东西有何实际意义呢,只要能排序不就行了吗?

其实不然,设想一下这两个场景:

在一个商品列表页面,用户先点击"按销量"排序,再点击"按价格"排序。如果排序是不稳定的,那么用户会发现,在价格相同的商品中,其原来的销量顺序是混乱的,这会让用户感到困惑,破坏了之前的操作逻辑。

同理,在一个任务队列中,我们通常是先按"优先级"排序,再按"提交时间"排序。而不稳定的排序可能会让同优先级但提交更早的任务被排到后面,这违反了"先进先出"的公平原则,可能导致业务逻辑错误。

总而言之,稳定性能在排序时保持"相同值"元素的原始相对顺序,是实现多级排序 、保证结果可预测性和业务逻辑正确性的关键。

插入排序

按照图中的顺序,我们先来讲插入排序(这部分内容后边会单独作为一篇文章发布)

相关推荐
汀、人工智能6 小时前
[特殊字符] 第24课:反转链表
数据结构·算法·链表·数据库架构··反转链表
田梓燊6 小时前
leetcode 41
数据结构·算法·leetcode
凌波粒6 小时前
LeetCode--18.四数之和(双指针法)
数据结构·算法·leetcode
汀、人工智能7 小时前
[特殊字符] 第26课:环形链表
数据结构·算法·链表·数据库架构··环形链表
小比特_蓝光7 小时前
算法篇二----二分查找
java·数据结构·算法
会编程的土豆8 小时前
【数据结构与算法】 拓扑排序
数据结构·c++·算法
笨笨饿9 小时前
34_数据结构_栈
c语言·开发语言·数据结构·人工智能·嵌入式硬件·算法
im_AMBER9 小时前
Leetcode 152 被围绕的区域 | 岛屿数量
数据结构·算法·leetcode·深度优先·广度优先·图搜索算法
吕司9 小时前
LeetCode Hot Code——最大子数组和
数据结构·算法·leetcode