目录
一、插入排序(O(n^2))
def insert(test_list):
for i in range(1, len(test_list)):
index = i -1
while index >= 0 and test_list[i] < test_list[index]:
# 只有 要插入的值 小于 已经排好序的数组中的数,也就是后面的数较小的时候才进行处理,以下几种方法理念同此
test_list[i], test_list[index] = test_list[index], test_list[i]
i = index
index -= 1
return test_list
二、冒泡排序
def bubble_sort(test_list):
length = len(test_list)
for i in range(length):
flag = True
# length - 1 为最后一位元素
for j in range(length - 1 - i): # 每排一次,会有一个最大值在最后面,所以 - i
if test_list[j] > test_list[j+1]:
# 如果当前元素比后面的元素大,则一直往后移动
# 5 3 9 1 -> 3 5 9 1 -> 3 5 1 9
test_list[j], test_list[j+1] = test_list[j+1], test_list[j]
flag = False
# print(test_list)
if flag:
break
return test_list
三、快排(递归 O(nlogn))
def kuaipai(test_list):
"""
最优:快排有去重功能,循环或者迭代里变量赋值也要尽量少
"""
if test_list == []:
return []
else:
left = [i for i in test_list if i<test_list[0] ]
right = [i for i in test_list if i>test_list[0] ]
return kuaipai(left) + test_list[0:1] + kuaipai(right)
四、选择排序
def choose(test_list):
length = len(test_list)
for i in range(length):
min_num_index = i # 假设test_list[j]为最小元素
for j in range(i + 1, length):
if test_list[j] < test_list[min_num_index]:
# 此处相反,每次找出最小元素的位置
min_num_index = j
test_list[min_num_index], test_list[i] = test_list[i], test_list[min_num_index] # 把当前找到的最小元素放到前面
return test_list
五、归并排序(适合大规模数据排序)
def mergeArray(test_list):
if len(test_list) <= 1:
return test_list
mid = len(test_list) // 2
left = mergeArray(test_list[:mid])
right = mergeArray(test_list[mid:])
return merge(left, right)
def merge(nums1, nums2):
# 合并 2 个有序数组
res = []
left, right = 0, 0
while left < len(nums1) and right < len(nums2):
if nums1[left] < nums2[right]:
res.append(nums1[left])
left += 1
else:
res.append(nums2[right])
right += 1
res.extend(nums1[left:])
res.extend(nums2[right:])
return res