前言
原理就不在这里说了,好多大神肯定比我这个初学者讲的好很多,推荐去B站看视频讲解,跟着手敲代码
为什么选这三个排序呢?
首先快排是必须掌握的
看看快排在最坏的情况下(O(n²)),且不使用辅助空间,与冒泡(O(n²))的比较
由于快排是不稳定的排序算法,且平均时间复杂度为O(nlogn),那找一个时间复杂度为O(nlogn)且稳定排序算法,那么就非归并排序莫属了.
一、快速排序,归并排序,冒泡排序比较
算法时间复杂度空间复杂度稳定性
平均最好最坏
冒泡排序O(n²)O(n)O(n²)O(1)稳定
快速排序O(nlogn)O(nlogn)O(n²)O(1)或O(n)不稳定
归并排序O(nlogn)O(nlogn)O(nlogn)O(n)稳定
二、源码
引入库,并生成1000个随机数,然后深拷贝若干份.
import random
from copy import deepcopy
arr0 = [random.randint(1, 100) for _ in range(1000)]
# arr0 = [_ for _ in range(1000, 0, -1)]
# print(arr0)
for i in range(1, 11):
exec(f'arr{i} = deepcopy(arr0)')
1.冒泡
def bubble_sort(arr):
for i in range(len(arr) - 1):
for j in range(len(arr) - 1 - i):
if arr[j] >= arr[j + 1]:
arr[j], arr[j + 1] = arr[j + 1], arr[j]
return arr
2.归并
def merge_sort(arr):
length = len(arr)
if length <= 1:
return arr
mid = length // 2
# 以下标mid为分界点,将arr的[:mid]给left,[mid:]给right
left = merge_sort(arr[:mid])
right = merge_sort(arr[mid:])
lp = 0
rp = 0
res = []
# 切记这里不是<=,因为数组的index一定是小于数组长度的
while lp if left[lp] <= right[rp]:
res.append(left[lp])
lp += 1
else:
res.append(right[rp])
rp += 1
# 这里要用extend. left,right切片后的值为一个list
res.extend(left[lp:])
res.extend(right[rp:])
return res
3.快排
# 一句话快排
qs = lambda arr: arr if len(arr) <= 1 else qs([it for it in arr[1:] if it <= arr[0]]) + [arr[0]] + \
qs([it for it in arr[1:] if it > arr[0]])
# 空间复杂度O(1)的快排
def quick_sort_O1(arr, left, right):
if left >= right:
return
base = arr[left]
lp = left
rp = right
while lp while lp
rp -= 1
arr[lp] = arr[rp]
while lp