排序和搜索
排序算法:是一种能将一串数据按照特定顺序进行排列的一种算法
一. 排序算法的稳定性
稳定性: 稳定排序算法会让原本有相等键值的记录维持相对次序,也就是如果一个排序算法时稳定的,当有两个相同键值的记录R和S,且在原本的列表中R出现在S的前面,在排序过的列表中R也将是在S之前
(稳定的算法可能更适合一些实际情况的需要,排序之前的原序列里的顺序可能隐含一些有用的信息,表示一些与实际问题相关的性质,稳定的排序算法将维持这些信息和性质)
适应性:排序操作可能被用于处理不同长度的序列,复杂度的描述方式考虑了这一问题,但是,即使是同样长的被排序序列,情况也很不一样,例如,有时被排序的序列可能很接近排好序的形式,或者原本就是已经排好序的序列,在这些情况下,一个序列算法能否更快完成工作,排序算法的适应性考虑这个问题,如果一个排序算法对接近有序的序列工作得更快,就称这种算法具有适应性,具有适应性的算法也有实际价值,因为实际中常常需要处理接近排序的序列
二. 排序算法的分类
为了理解各种排序算法在想法和做法等方面的异同,人们经常把经典的排序算法分为一些类别,常见类别:
- 插入排序
- 选择排序
- 交换排序
- 分配排序
- 归并排序
- 外部排序
三. 冒泡排序
def bubble_sort(alist):
n = len(alist)
count = 0
for j in range(n - 1):
for i in range(0, n - 1 - j):
if alist[i] > alist[i + 1]:
alist[i], alist[i + 1] = alist[i + 1], alist[i]
count += 1
if count == 0:
print(alist)
return
print(alist)
if __name__ == "__main__":
bubble_sort([6, 5, 4, 3, 2, 1])
时间复杂度
* 最优时间复杂度:O(n) 表示遍历一次没有发现任何可以交换的元素,排序结束
* 最坏时间复杂度: O(n²)
* 稳定性: 稳定
暗号: 一个班长 比较两个 找到最大的放最后