1、快速排序
"""
挑选基准值:从数列中挑出一个元素,称为“基准”(pivot),
分割:重新排序数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面(与基准值相等的数可以到任何一边)。在这个分割结束之后,对基准值的排序就已经完成,
递归排序子序列:递归地将小于基准值元素的子序列和大于基准值元素的子序列排序
"""
import sys
sys.setrecursionlimit(1000000)
def fastSort(alist, first, last):
# 定义递归条件
if first < last:
mid = alist[first]
left = first
right = last
# 定义拆分条件
while left < right:
# 往右侧推进
while right > left and alist[right] >= mid:
right -= 1
# right小于 mid值,left 标签设置为right标签元素
alist[left] = alist[right]
# 往左侧推进
while left < right and alist[left] < mid:
left += 1
alist[right] = alist[left]
# 获取中间值
alist[left] = mid
# 对切割后左边的子部分进行快速排序
fastSort(alist, first, left-1)
# 对切割后右边的子部分进行快速排序
fastSort(alist,left+1, last)
return alist
test_list1 = [30,24,5,58,18,36,12,42,39]
test_list2 = [54,33,77,6, 44, 17, 77, 31,17, 93, 55]
result = fastSort(test_list2, 0, len(test_list2)-1)
print(result)
# 输出结果
# [6, 17, 17, 31, 33, 44, 54, 55, 77, 77, 93]
2、冒泡排序
"""
1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
3. 针对所有的元素重复以上的步骤,除了最后一个。
4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
"""
import random
def bubble_sort(alist):
# 获取列表元素的总数量
n = len(alist)
# 冒泡排序的循环范围
for j in range(n-1, 0, -1):
count = 0
for i in range(j):
if alist[i] > alist[i+1]:
alist[i], alist[i+1] = alist[i+1], alist[i]
count += 1
if count == 0:
break
if __name__ == "__main__":
li = list(range(5))
random.shuffle(li)
print('排序前:{}'.format(li))
bubble_sort(li)
print('排序后:{}'.format(li))
# 输出
# 排序前:[2, 0, 1, 3, 4]
# 排序后:[0, 1, 2, 3, 4]
3、选择排序
def selection_sort(alist):
# 当前列表的长度
n = len(alist)
# 定义外围循环次数
for j in range(n - 1):
# 定义min_index的初始值为j
min_index = j
# cur的下标移动范围
for i in range(j + 1, n):
# 找到最小元素
if alist[i] < alist[min_index]:
min_index = i
# mix标签元素和无序队列首位置元素替换
if min_index != j:
alist[j], alist[min_index] = alist[min_index], alist[j]
return alist
4、插入排序
def insert_sort(alist):
# 无序队列元素数量
n = len(alist)
# 有序队列循环的次数
for i in range(0, n):
# 比较循环次数的确定
for j in range(i, 0, -1):
# 假设26的下标是j,那么54的下标为j-1
if alist[j] < alist[j - 1]:
# 大小数值元素进行替换
alist[j], alist[j - 1] = alist[j - 1], alist[j]
# 否则的话,大小元素不替换
else:
break
return alist