# -*- coding:utf-8 -*-
# 排序总结
# 冒泡
def maopao(nums: list) -> list:
length = nums.__len__()
for i in range(length):
for j in range(1, length):
if nums[j - 1] > nums[j]:
nums[j - 1], nums[j] = nums[j], nums[j - 1]
return nums
# 选择
def xuanze(nums: list) -> list:
length = nums.__len__()
if length <= 1:
return nums
for i in range(length - 1):
# index_min_num:i
for j in range(i, length):
if nums[j] < nums[i]:
nums[i], nums[j] = nums[j], nums[i]
return nums
# 插入
def charu(nums: list) -> list:
length = nums.__len__()
for i in range(1, length):
need_insert_num = nums[i]
# 将nums[i]插入已排序序列nums[1..k-1]
j = i - 1
while j >= 0 and nums[j] > need_insert_num:
nums[j + 1] = nums[j]
j -= 1
nums[j + 1] = need_insert_num
return nums
# 希尔排序
def xier(nums: list) -> list:
length = nums.__len__()
gap = 1
gapc = 3
while gap < length / gapc:
gap = gap * gapc + 1
while gap > 0:
for i in range(gap, length):
temp = nums[i]
j = i - gap
while j >= 0 and nums[j] > temp:
nums[j + gap] = nums[j]
j -= gap
nums[j + gap] = temp
gap = gap // gapc
return nums
# 归并排序
def guibing(nums: list) -> list:
def merge(left: list, right: list):
result = []
while left and right:
if left[0] <= right[0]:
result.append(left.pop(0))
else:
result.append(right.pop(0))
result += left + right
return result
length = nums.__len__()
if length < 2:
return nums
middle_index = length // 2
return merge(guibing(nums[:middle_index]), guibing(nums[middle_index:]))
# 快排
def kuaipai(nums: list) -> list:
length = nums.__len__()
if length <= 1:
return nums
mid = nums[0]
left, right = [], []
for i in nums[1:]:
if i <= mid:
left.append(i)
else:
right.append(i)
return kuaipai(left) + [mid] + kuaipai(right)
if __name__ == "__main__":
# import numpy as np
# nums = np.arange(10)
# np.random.shuffle(nums)
# nums = list(nums)
import random
nums = list(range(10))
# random.shuffle(nums)
# print(f"原始数组: {nums}")
import time
sorted_nums = sorted(nums)
method = [
("冒泡排序", "maopao"),
("选择排序", "xuanze"),
("插入排序", "charu"),
("希尔排序", "xier"),
("归并排序", "guibing"),
("快速排序", "kuaipai"),
]
for i, m in enumerate(method):
random.shuffle(nums)
t0 = time.time()
assert eval(m[1])(nums) == sorted_nums
print(f"{m[0]}: {time.time()- t0}")
排序算法总结--ING
最新推荐文章于 2024-04-13 16:47:00 发布