一 交换排序
1、冒泡排序
python
# todo 比较相邻元素,往前或往后进行比较,每次找出最大或最小的一个值
def bubblesort(list):
len_list = len(list)
# 如果就一个数值,直接返回,不需要再进行排序
if len_list <= 1:
return list
# 如果有多个数值,进行冒泡排序
# 每进行一遍 i ,就相当于走了一遍排序,选出一个最大或最小的数值,这时候只需要再遍历比较剩下的 len(list) -1 -i 个数就可以了
# todo len(list) -1:数组下表 0 开始,最后一个元素下表是 len(list) -1
# todo -i:每次遍历剩下的数,减去已经遍历过的 i 个数
for i in range(len_list):
# len_list - 1 - i : 还剩下多少趟
for j in range(0,len_list - 1 - i):
if list[j] < list[j + 1]:
list[j + 1], list[j] = list[j], list[j + 1]
return list
if __name__ == '__main__':
in_ = input('请输入待排序数列(例:1,2,3):\n')
in_split = in_.split(',')
# ['1', '2']
arr = []
# 对列表中的元素进行数值类型转换
for i in in_split:
arr.append(int(i))
# print(arr)
bubblesort1 = bubblesort(arr)
print(bubblesort1)
2、快速排序
python
# todo 需要递归调用分区进行排序
def quick_sort(list):
def partition(list,left,right):
key = left
while left < right:
# todo 升序
# 右边的数值小于基准,不进行变动,这一步可以找到比基准 小 的值,如果 list[right] 比基准大,那么就前移一位,不满足条件时候
# right-1 就是比基准小的数的下表
while left < right and list[right] >= list[key]:
right -= 1
# 右边的数大于基准,进行数值交换,这一步可以找到比基准 大 的值,如果 list[left] 比基准小,那么就右移一位,不满足条件时候
# left+1 就是比基准大的数的下表
while left < right and list[left] <= list[key]:
left += 1
# todo 经过两次比较之后,找到了一个比基准大的,一个比基准小的,这时候交换二者的值即可
list[left],list[right] = list[right],list[left]
# todo 当左右两边逐渐逼近的时候,当 right=left 即满足遍历比较了一次,这时候要把基准值 key=left=right
# 交换 key与left的值,完成第一次的快排
list[left],list[key] = list[key],list[left]
# todo 这个时候已经进行完毕了第一次的快排,左边都是比key小的,右边都是比key大的
return left
def rescusive(list,left,right):
if left >= right:
return
# 第一次分区,从基准开始
mid = partition(list,left,right)
# 递归调用
rescusive(list, left, mid - 1)
rescusive(list, mid + 1, right)
# 主函数
len_list = len(list)
if len_list <= 1:
return list
rescusive(list,0,len_list-1)
return list
if __name__ == '__main__':
in_ = input('请输入待排序数列(例:1,2,3):\n')
in_split = in_.split(',')
# ['1', '2']
arr = []
# 对列表中的元素进行数值类型转换
for i in in_split:
arr.append(int(i))
quicksort = quick_sort(arr)
print(quicksort)
二 插入排序
1、插入排序
python
# todo 每次从后取一个数插入到前面已经排好序的序列中,需要与之前已排好序的进行比较
def insert_sort(list):
len_list = len(list)
if len_list <= 1:
return
# todo 用 i 来记录遍历了几次
for i in range(1,len_list):
print('第{}次循环'.format(i))
# i 不变,用来记录循环次数,将这个值赋给 j,用j来代替 i 进行往前遍历
j = i
# 拿到需要进行排序的 数值
wait_sort = list[i]
while j > 0 and wait_sort < list[j-1]:
list[j] = list[j-1]
j -= 1
list[j] = wait_sort
return list
if __name__ == '__main__':
in_ = input('请输入待排序数值(例:1,2,3):\n')
in_split = in_.split(',')
arr = []
for i in in_split:
arr.append(int(i))
in_sort = insert_sort(arr)
print(in_sort)
三 数值排序
1、计数排序
python
# todo 创建全0列表,将列表中的值作为下表,计数出现的次数,之后再遍历 计数列表,看指定index值是多少,就往列表中添加多少次
def count_number_sort(lst):
n = len(lst)
num = max(lst)
# 生成全 0 列表,后续用来记录每个数出现了几次,用于计数,比如输入的是 [2,1,2],那么生成的就是 [0,0,0]
# 将值作为下表,那么就是 [0,1,2]:代表 0没有 1有一个 2有两个
# 全0列表长度 = 列表中的最大值
# 输入列表:[2,1,2]
# 生成的全0列表:[0,0,0]
count = [0] * (num + 1)
# 根据 下标(列表中的数值) 进行计数
for i in range(0, n):
count[lst[i]] += 1
# count[lst[0]=2] = [0,0,1]
# count[lst[1]=1] = [0,1,1]
# count[lst[2]=2] = [0,1,2]
arr = []
# i 取值是全 0 列表的长度,+1 是因为 右开,需要保证能取到 列表长度,所以要 +1
for i in range(0, num + 1):
# count[i]是多少,就往 arr 列表中加几次 i,这样保证从 count 列表中是有序取出加到 arr 中的
for j in range(0, count[i]):
arr.append(i)
return lst
if __name__ == '__main__':
in_ = input('请输入(列:1,2,3):\n')
in_split = in_.split(',')
arr = []
for i in in_split:
arr.append(int(i))
print(count_number_sort(arr))
四 选择排序
1、选择排序
python
# todo 每次从剩下的待排序的序列中选出一个插入到前边已排好序的序列中的'末尾',不再需要跟前边已排好序的进行比较,遍历一次末尾插入一个
def ChooseSort(list):
len_list = len(list)
if len_list <= 1:
return
for i in range(len_list):
min_val = list[i]
min_index = i
for j in range(i+1,len_list):
if list[j] < min_val:
# 如果有小于的,那么更新当前的最小值和最小下表
min_val = list[j]
min_index = j
# 对最小值和第i位的值进行互换
list[i],list[min_index] = list[min_index],list[i]
return list
if __name__ == '__main__':
in_ = input('请输入(例:1,2,3)\n')
in_split = in_.split(',')
arr = []
for i in in_split:
arr.append(int(i))
res = ChooseSort(arr)
print(res)