排序
📌 选择排序 - Selection Sort
时间复杂度:O(n^2);空间复杂度:O(1)。
🎗 基本思路
- 在未排序序列中找到最小(或最大)元素,存放到排序序列的起始位置。
- 再从剩余未排序元素中继续寻找最小(或最大)元素,然后放到已排序序列的末尾。
- 重复第二步,直到所有元素均排序完毕。
补充
时间复杂度,表示算法在最坏情况下的时间增长趋势。
空间复杂度,评估算法在执行过程中所使用的额外空间(不包括输入数据所占用的空间)。
📌 快速排序 - Quick Sort
时间复杂度:最好O(nlogn),最坏O(n^2);空间复杂度:O(1)。
🎗 基本思路
- 选定基准值:从待排序的数组中,通常选择第一个或最后一个元素,或者采用随机选择。
- 分割数组:与基准值作比较,将待排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小(或大)。
- 递归排序:对分割后的两部分数据分别进行快速排序。
- 合并:若在原数组上进行操作,则无需额外空间以及合并。
📌 归并排序 - Merge Sort
时间复杂度:O(nlogn);空间复杂度:O(n)。
🎗 基本思路
- 分解:将待排序的数组不断分成两个子数组,直到每个子数组只有一个元素为止。
- 递归排序:对这两个子数组分别进行归并排序。
- 合并:将两个已排序的子数组合并成一个有序数组,直到最后只剩下一个有序数组为止。合并过程中,需要用到一个辅助数组来暂存合并后的有序数组。
def merge_sort(arr: list):
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: list, right: list):
merged = []
left_index = 0
right_index = 0
# 合并两个子数组,直到其中一个被完全遍历
while left_index < len(left) and right_index < len(right):
if left[left_index] <= right[right_index]:
merged.append(left[left_index])
left_index += 1
else:
merged.append(right[right_index])
right_index += 1
# 将未完全遍历的子数组剩余部分添加到merged中
merged.extend(left[left_index:])
merged.extend(right[right_index:])
return merged
arr = [38, 27, 43, 3, 9, 82, 10]
sorted_arr = merge_sort(arr)
print(sorted_arr) # 输出: [3, 9, 10, 27, 38, 43, 82]