如有错误,请指出,多谢。
动图来自菜鸟教程,多谢。
一:插入排序

插入排序的基本思想是:每步将一个待排序的记录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止
import random
def InsertSort(arr):
for i in range(1,len(arr)):
#获取前一个下标和当前数字
index = i - 1
num = arr[i]
#当满足条件时,执行此while语句
while index >= 0 and arr[index] > num:
#如果前一个数大于当前数,交换
arr[index+1] = arr[index]
#把下标减1,继续判断,如果满足,继续执行while循环
index -= 1
arr[index+1] = num
print("排序后:",arr)
if __name__ == '__main__':
arr = []
x = random.randint(2,20)
for i in range(0,x):
arr.append(random.randint(1,1000))
print("排序前:",arr)
InsertSort(arr)
二:希尔排序

希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止
它实际上是插入排序的进阶,分组插入排序
import math
import random
def ShellSort(arr):
#立个flag
flag = 1
#用于获取flag数
while(flag < len(arr)/3):
#1*3+1,4*3+1,7*3+1
flag = flag*3+1
while flag > 0:
#插入排序
for i in range(flag,len(arr)):
index = i - flag
num = arr[i]
while index >= 0 and arr[index] > num:
arr[index+flag] = arr[index]
index -= flag
arr[index+flag] = num
flag = math.floor(flag/3)
print("排序后:",arr)
if __name__ == '__main__':
arr = []
x = random.randint(2,20)
for i in range(0,x):
arr.append(random.randint(1,1000))
print("排序前:",arr)
ShellSort(arr)
三:归并排序

归并操作的工作原理如下:
第一步:申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
第二步:设定两个指针,最初位置分别为两个已经排序序列的起始位置
第三步:比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
重复步骤3直到某一指针超出序列尾
将另一序列剩下的所有元素直接复制到合并序列尾
import random
def MergeSort(arr):
#递归出口
if len(arr) < 2:
return arr
#将传入的数组分为两部分,放入新的数组
middle = int(len(arr)/2)
left_arr = arr[0:middle]
right_arr = arr[middle:]
#递归调用
return Merge(MergeSort(left_arr),MergeSort(right_arr))
def Merge(left_arr,right_arr):
# print(left_arr,right_arr)
result = []
#当两个数组均不空时,将小的放入新数组
while left_arr and right_arr:
if left_arr[0] < right_arr[0]:
result.append(left_arr.pop(0))
else:
result.append(right_arr.pop(0))
#当其中一个数组空时
while right_arr:
result.append(right_arr.pop(0))
while left_arr:
result.append(left_arr.pop(0))
# print(result)
return result
if __name__ == '__main__':
arr = []
x = random.randint(2,20)
for i in range(0,x):
arr.append(random.randint(1,1000))
print("排序前:",arr)
print("排序后:",MergeSort(arr))
版权声明:本文为s_kangkang_A原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。