排序算法难度排行
| 排序算法 | 难度 |
|---|---|
| 冒泡排序 | ★☆☆☆☆ |
| 选择排序 | ★☆☆☆☆ |
| 插入排序 | ★★☆☆☆ |
| 希尔排序 | ★★★☆☆ |
| 归并排序 | ★★★☆☆ |
| 快速排序 | ★★★★☆ |
| 堆排序 | ★★★★☆ |
| 随机基准 / 三路快排 | ★★★★☆ |
| 基数排序 | ★★★★★ |
| 桶排序 | ★★★★★ |
一、插入排序(直接插入排序)
双层循环,外层循环对除了第一个元素之外的所有元素,内层循环对当前元素前面有序表进行待插入位置查找,并进行移动
原始序列

第一轮排序过程
内层循环元素6移动1次

第二轮排序,7<9,不用改变
内层循环元素9移动0次

第三轮排序
内层循环元素3移动3次

第四轮
内层循环元素1移动4次

第五轮
内层循环元素5移动3次

第六轮
元素2移动4次
第七轮
元素4移动3次
代码
python
def insert_sort(arr):
for i in range(1,len(arr)):# i 取值范围1-7
for j in range(i,0,-1):# j 取值范围7-1
if arr[j]<arr[j-1]:
temp = 0
temp = arr[j]
arr[j] = arr[j-1]
arr[j-1] = temp
else:
break #如果当前元素比前一个元素大,则跳出内层循环,否则有多余的比较
return arr
if __name__ == "__main__":
arr = [7,6,9,3,1,5,2,4]
print(insert_sort(arr))
二、希尔排序
核心是分组
第一轮:数组长度/2 = 4,4个间隔元素进行大小比较和交换

第二轮:4 /2 = 2,2个间隔元素进行大小比较

第三轮:2/2=1,间隔1个元素进行大小比较

代码
python
def shell_sort(arr):
#希尔排序
group = len(arr) // 2 #分组
while group > 0:
#对每个分组进行插入排序
for i in range(group, len(arr)):
temp = arr[i]
j = i
while j >= group and arr[j - group] > temp:
arr[j] = arr[j - group]
j -= group
arr[j] = temp
group //= 2
return arr
if __name__ == "__main__":
arr = [7,6,9,3,1,5,2,4]
print(shell_sort(arr))
三、归并排序
归并排序的核心是 "先分后合" :先将数组逐层二分拆分为最小单元(单个元素),再从最小单元开始有序合并相邻子数组,最终得到完整的有序数组

代码
python
def merge_sort(arr):
# 递归终止:数组只有1个元素或空,本身就是有序的
if len(arr) <= 1:
return arr
# 第一步:拆分------把数组分成左右两半
mid = len(arr) // 2 # 找中间位置
left = merge_sort(arr[:mid]) # 递归处理左半部分,让左半部分有序
right = merge_sort(arr[mid:]) # 递归处理右半部分,让右半部分有序
# 第二步:合并------把两个有序的左右数组合并成一个有序数组
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 # 返回合并好的有序数组
if __name__ == "__main__":
arr = [7, 6, 9, 3, 1, 5, 2, 4]
sorted_arr = merge_sort(arr)
print("原始数组:", arr)
print("排序后数组:", sorted_arr)
四、普通快速排序
采用双指针,找基准元素
代码
python
def quick_sort(arr, low, high):#high和low每次都是变,所以每次递归的参数都是不一样的
if low < high:
pivot = arr[high] # 选最后一个元素作基准
i = low - 1 # 小于等于基准的区域末尾指针
for j in range(low, high):
if arr[j] <= pivot:
i += 1
arr[i], arr[j] = arr[j], arr[i]
# 放置基准到最终位置
arr[i + 1], arr[high] = arr[high], arr[i + 1]
pivot_idx = i + 1
# 递归处理左右子数组
quick_sort(arr, low, pivot_idx - 1)
quick_sort(arr, pivot_idx + 1, high)
if __name__ == "__main__":
arr = [7, 6, 9, 3, 1, 5, 2, 4]
print("原始数组:", arr)
quick_sort(arr, 0, len(arr) - 1)
print("普通快速排序结果:", arr)