文章目录
一,排序算法时间复杂度比较
算法 | 最坏情况下 | 平均情况下 |
---|---|---|
插入排序 | O(n² ) | O(n²) |
冒泡排序 | O(n²) | O(n²) |
快速排序 | O(n²) | O(nlogn) |
堆排序 | O(nlogn) | O(nlogn) |
二分归并排序 | O(nlogn) | O(nlogn) |
二,插入排序
假设原始序列为:[5,7,1,3,6,2,4]
首先假设第一个元素5已经排好,然后插入第二个元素7但是7比5大所以7放在5的右边,接着是第三个元素1,1比7小所以再7左边并且1比5小所以放在5的左边。第四个元素3于7比较比7小在7左边并且比5小所以在5左边但是3比1小所以插入到1和5之间,其他的类似。。。。
原始序列 | 5 | 7 | 1 | 3 | 6 | 2 | 4 |
---|---|---|---|---|---|---|---|
插入零次 | 5 | 7 | 1 | 3 | 6 | 2 | 4 |
插入一次 | 5 | 7 | 1 | 3 | 6 | 2 | 4 |
插入二次 | 1 | 5 | 7 | 3 | 6 | 2 | 4 |
插入三次 | 1 | 3 | 5 | 7 | 6 | 2 | 4 |
插入四次 | 1 | 3 | 5 | 6 | 7 | 2 | 4 |
插入五次 | 1 | 2 | 3 | 5 | 6 | 7 | 4 |
插入六次 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
python
a = [5,7,1,3,6,2,4]
n = len(a)
for i in range(1, n):
key = a[i] # 当前待插入元素
j = i - 1 # 已排序部分的最后一个元素的索引
while j >= 0 and a[j] > key:
a[j + 1] = a[j] # 向后移动元素
j -= 1
a[j + 1] = key # 插入元素到正确位置
print(a)
#[1, 2, 3, 4, 5, 6, 7]
三,冒泡排序
假设原始序列为:[5,7,1,3,6,2,4]
首先5和7比较,5比7小不交换顺序,7和1比较,7比1大交换顺序,7和3比较,7比3大交换顺序,7和6比较7比6大交换顺序,7和4比较,7比4大交换顺序。以此类推
原始序列 | 5 | 7 | 1 | 3 | 6 | 2 | 4 |
---|---|---|---|---|---|---|---|
冒泡一次 | 5 | 1 | 3 | 6 | 2 | 4 | 7 |
冒泡二次 | 1 | 3 | 5 | 2 | 4 | 6 | 7 |
冒泡三次 | 1 | 3 | 2 | 4 | 5 | 6 | 7 |
冒泡四次 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
python
a = [5,7,1,3,6,2,4]
n = len(a)
for i in range(n):
for j in range(0, n-i-1):
if a[j] > a[j+1]:
a[j], a[j+1] = a[j+1], a[j]
print(a)
#[1, 2, 3, 4, 5, 6, 7]
四,快速排序
假设原始序列为:[5,7,1,3,6,2,4]
首先以第一个元素5为划分的标准,从前面找第一个比5大的从后面找第一个比5小的交换位置,然后再找下一个比大的和比5小的交换位置。第二次交换是发生在两个相邻的元素之间做的所以说2前面的都比5小,6后面的都比5大所以2的位置是第一个元素5的位置,然后交换2和5的位置,这样5的位置就定下来了,再分别对两边递归调用同样的方法。
原始序列 | 5 | 7 | 1 | 3 | 6 | 2 | 4 |
---|---|---|---|---|---|---|---|
交换一次 | 5 | 4 | 1 | 3 | 6 | 2 | 7 |
交换二次 | 5 | 4 | 1 | 3 | 2 | 6 | 7 |
划分 | 2 | 4 | 1 | 3 | 5 | 6 | 7 |
递归运行 | 2 | 4 | 1 | 3 | 5 | 6 | 7 |
python
a = [5,7,1,3,6,2,4]
def fast_sort(a):
if len(a) <= 1:
return a
basis = a[0]
left_num = [i for i in a[1::] if i < basis]
middle = [i for i in a if i == basis]
right_num = [i for i in a[1::] if i > basis]
return fast_sort(left_num) + middle + fast_sort(right_num)
print(fast_sort(a))
#[1, 2, 3, 4, 5, 6, 7]
五,堆排序
pass
六,二分归并排序
它将待排序的列表递归地分成两个子列表,直到每个子列表只包含一个元素。然后,将这些子列表按照顺序合并,形成一个有序的列表。
假设原始序列为:[5,7,1,3,6,2,4]
首先先把序列一份为二 (标注和没标注的),然后对每个子列里面也分别进行二分归并排序,然后把已经排好的子数合并(两个序列的首元素比较哪个小就把哪个拿走,知道一个数组空了就把另一个数组全部接在后面)。
原始序列 | 5 | 7 | 1 | 3 | 6 | 2 | 4 |
---|---|---|---|---|---|---|---|
归分 | 5 | 4 | 1 | 3 | 6 | 2 | 7 |
递归排序 | 1 | 3 | 4 | 5 | 2 | 6 | 7 |
开始组合 | 1 | 3 | 4 | 5 | 2 | 6 | 7 |
原 | 3 | 4 | 5 | 2 | 6 | 7 | |
新数组 | 1 | ||||||
原 | 3 | 4 | 5 | 6 | 7 | ||
新数组 | 1 | 2 | |||||
原 | 4 | 5 | 6 | 7 | |||
新数组 | 1 | 2 | 3 | ||||
原 | 5 | 6 | 7 | ||||
新数组 | 1 | 2 | 3 | 4 | |||
原 | 6 | 7 | |||||
新数组 | 1 | 2 | 3 | 4 | 5 | ||
原 | |||||||
新数组 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
python
a = [5, 7, 1, 3, 6, 2, 4]
def merge_sort(arr):
if len(arr) <= 1:
return arr
mid = len(arr) // 2
left = arr[:mid]
right = arr[mid:]
left = merge_sort(left)
right = merge_sort(right)
return merge(left, right)
def merge(left, right):
merged = []
i = j = 0
while i < len(left) and j < len(right):
if left[i] <= right[j]:
merged.append(left[i])
i += 1
else:
merged.append(right[j])
j += 1
while i < len(left):
merged.append(left[i])
i += 1
while j < len(right):
merged.append(right[j])
j += 1
return merged
print(merge_sort(a))