先把代码贴上来,以后我会详细解释每一种排序的原理,以下每种代码都经过了验证和代码简化。
1.冒泡排序
def bubble_sort(nums):
for i in range(len(nums)):
for j in range(len(nums)-i-1):
if nums[j] > nums[j+1]:
nums[j],nums[j+1] = nums[j+1],nums[j]
return nums
2.插入排序
def insert_sort(nums):
for i in range(1, len(nums)):
key = nums[i]
j = i - 1
while j >= 0:
if nums[j] > key:
nums[j + 1] = nums[j]
nums[j] = key
j -= 1
return nums
3.快速排序
def quick_sort(nums, l, r):
if l < r:
q = partition(nums, l, r)
quick_sort(nums, l, q - 1)
quick_sort(nums, q + 1, r)
def partition(nums, l, r):
x = nums[r]
i = l - 1
for j in range(l, r):
if nums[j] <= x:
i += 1
nums[i], nums[j] = nums[j], nums[i]
nums[i + 1], nums[r] = nums[r], nums[i+1]
return i + 1
4.归并排序
def merge(left, right):
i, j = 0, 0
result = []
while i < len(left) and j < len(right):
if left[i] <= right[j]:
result.append(left[i])
i += 1
else:
result.append(right[j])
j += 1
result += left[i:]
result += right[j:]
return result
def merge_sort(nums):
if len(nums) <= 1:
return nums
mid = len(nums) // 2
left = merge_sort(nums[:mid])
right = merge_sort(nums[mid:])
return merge(left, right)
5.选择排序
def selection_sort(nums):
n = len(nums)
for i in range (n):
min = i
for j in range(i+1,n):
if nums[j] < nums[min]:
min=j
if min != i:
nums[min], nums[i] = nums[i], nums[min]
return nums
6.堆排序
def heap_sort(list):
# 创建最大堆
for start in range(len(list) // 2 - 1, -1, -1):
sift_down(list, start, len(list) - 1)
# 堆排序
for end in range(len(list) - 1, 0, -1):
list[0], list[end] = list[end], list[0]
sift_down(list, 0, end - 1)
print(list)
return list
# 最大堆调整
def sift_down(lst, start, end):
root = start
while True:
child = 2 * root + 1
if child > end:
break
if child + 1 <= end and lst[child] < lst[child + 1]:
child += 1
if lst[root] < lst[child]:
lst[root], lst[child] = lst[child], lst[root]
root = child
else:
break