所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减排列起来的操作。排序是计算机内经常进行的一种操作,其目的是将一组无序的记录序列调整为有序的记录序列。
评价指标:时间复杂度、空间复杂度、稳定性、使用场景
1. 冒泡排序
算法流程
-
输入
n个数的序列,通常直接存放在数组中,可能是任何顺序。 -
输出
输入序列的一个新排列,满足从小到大的顺序(默认讨论升序,简单的修改就可以实现降序排列)。
算法说明
- 遍历 n − 1 n-1 n−1 轮,每一轮会排好一个元素。
- 第一轮遍历如下图。 黄色区域为正在比较元素,最大元素会往后挪。第一轮遍历结束,最大元素挪至序列最后。
- 之后类似,第二轮遍历前 n − 1 n -1 n−1 个元素,将其中最大元素挪到末尾。直到遍历完序列。
轮次 | 比较次数 |
---|---|
1 | n − 1 n-1 n−1 |
2 | n − 2 n-2 n−2 |
3 | n − 3 n-3 n−3 |
… \dots … | … \dots … |
n − 1 n-1 n−1 | 1 |
总的比较次数为:
1
+
2
+
3
+
⋯
+
(
n
−
1
)
=
n
(
n
−
1
)
2
1 + 2 + 3 + \dots + (n - 1) = \frac {n (n-1)} {2}
1+2+3+⋯+(n−1)=2n(n−1)
即表明算法时间复杂度为
O
(
n
2
)
O(n^2)
O(n2)。
伪代码
for i = 1 to n-1
change = 0
for j = n downto i + 1
if A[j] < A[j - 1]
exchange A[j] with A[j-1]
change = 1
if change == 0
return
算法评价
- 时间复杂度: O ( n 2 ) O(n^2) O(n2),
- 空间复杂度: O ( 1 ) O(1) O(1)
- 适用场景:数据量较少且基本有序
- 稳定性:稳定
2. 算法实践(Python)
冒泡排序
# coding=utf-8
def bubble_sort(array):
for i in range(len(array)-1, 0, -1):
for j in range(0, i):
if array[j] > array[j+1]:
array[j], array[j+1] = array[j+1], array[j]
return array
if __name__ == '__main__':
array = [10, 17, 50, 7, 30, 24, 27, 45, 15, 5, 36, 21]
print(bubble_sort(array))
[5, 7, 10, 15, 17, 21, 24, 27, 30, 36, 45, 50]
短冒泡排序
如果在一轮遍历中,未发生元素交换,则意味着序列已经有序。则可以结束循环。
通过一个 exchanges 标记实现, 如下:
def short_bubble_sort(array):
exchanges = True
passnum = len(array) - 1
while passnum > 0 and exchanges:
exchanges = False
for i in range(0, passnum):
if array[i] > array[i + 1]:
exchanges = True
array[i], array[i + 1] = array[i + 1], array[i]
passnum -= 1
return array
参考
1.一文学懂经典算法系列之:直接插入排序
2.张清云.《Python数据结构学习笔记》(ISBN:9787113269999)