前言
内容大多引用菜鸟教程,写完了才发现教程讲的非常详细,我这里只针对python的代码实现
排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存
名词解释:
- n:数据规模
- k:"桶"的个数
- In-place:占用常数内存,不占用额外内存
- Out-place:占用额外内存
- 稳定性:排序后 2 个相等键值的顺序和排序之前它们的顺序相同
一、冒泡排序
1.1 算法步骤
- 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
- 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
- 针对所有的元素重复以上的步骤,除了最后一个。
- 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
1.2 图解
1.3 排序效率
(1)当输入的数据已经是正序时,就不需要冒泡排序了
(2)当输入的数据是反序时,写一个 for 循环反序输出数据就行,没必要麻烦的用冒泡排序
1.4 Python代码实现
def bubble_sort(nums):
for i in range(1, len(nums) - 1): # 设置冒泡排序进行的次数
for j in range(0, len(nums) - i): # j为列表下标
if nums[j] > nums[j + 1]:
nums[j], nums[j + 1] = nums[j + 1], nums[j] #交换两值
return nums
print(bubble_sort([45, 32, 8, 33, 12, 22, 19, 97]))
# 输出:[8, 12, 19, 22, 32, 33, 45, 97]
二、选择排序
数据规模越小越好
2.1 算法步骤
- 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。
- 再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
- 重复第二步,直到所有元素均排序完毕。
2.2 图解
2.3 Python代码实现
def selectionSort(nuns):
for i in range(len(nums) - 1):
# 记录最小数的索引
minIndex = i
for j in range(i + 1, len(nums)):
if nums[j] < nums[minIndex]:
minIndex = j
# i 不是最小数时,将 i 和最小数进行交换
if i != minIndex:
nums[i], nums[minIndex] = nums[minIndex], nums[i]
return nums
三、插入排序
- 工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入
- 是简单排序中效率最好的一种
3.1 算法步骤
- 将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。
- 从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。)
3.2 图解
3.3 排序效率
(1)当输入的数据已经是正序时,需要进行的比较操作是 (n-1)次
(2)当输入的数据是反序时,需要进行的比较共有n(n-1)/2次
3.4 Python代码实现
def insertionSort(nums):
for i in range(len(nums)):
preIndex = i-1
current = nums[i] # 保存当前元素值,拿前面的值和它比较
while preIndex >= 0 and nums[preIndex] > current:
nums[preIndex+1] = nums[preIndex] # 将前面较大的元素向后移
preIndex -= 1
nums[preIndex+