需要的库:
import sys
import time
sys.setrecursionlimit(1000000) #手动设置递归深度,如果不设置,当数字取多一些时,快速排序,归并函数因为利用了递归, 会溢出,报错
首先先建立一个函数得出1000个大小在(0,9999)之间的随机数
# 随机生成0-10000之间的数值
def getrandata(num):
a = []
i = 0
while i <= num:
a.append(random.randint(0, 9999))
i += 1
print(a)
return a
a = getrandata(1000)
1、冒泡排序
冒泡排序是最简单的排序之一了,其大体思想就是通过与相邻元素的比较和交换来把小的数交换到最前面。这个过程类似于水泡向上升一样,因此而得名。举个栗子,对5,3,8,6,4这个无序序列进行冒泡排序。首先从后向前冒泡,4和6比较,把4交换到前面,序列变成5,3,8,4,6。同理4和8交换,变成5,3,4,8,6,3和4无需交换。5和3交换,变成3,5,4,8,6,3.这样一次冒泡就完了,把最小的数3排到最前面了。对剩下的序列依次冒泡就会得到一个有序序列。冒泡排序的时间复杂度为O(n^2)。
# 冒泡排序 时间复杂度O(n^2)
'''
算法思路: 每次从最后开始往前面滚,相邻元素两两比较,小元素交换到前面,每一轮把最小到元素上浮至第一个位置
第一轮,n个数, 比较 n-1 次,得到最小数,放在第一位,
第二轮,比较剩余 n-1 个数, 比较 n-2 次, 得到第二小的数, 放在第二位
以此类推
最后总比较次数:1 + 2 + 3 + 。。。 + (n-1) = (1+n-1)*(n-1)/2 = n(n-1)/2
'''
def maopao(a):
start_time = time.time()*1000
x = len(a)
for i in range(x-1):
for j in range(i,x-1)[::-1]: # 每轮的比较数列为[第i个, 最后],因为每一轮已经将最小第数放到最前面
if a[j+1] < a[j]:
a[j], a[j+1] = a[j+1], a[j]
use_time = time.time()*1000 - start_time
print('1 冒泡排序: ',a,'\n', '使用时间: ', '%s ms' % use_time)
maopao(a)
结果:排序完的的结果太长,不列出来了, 使用时间: 155.197021484375 ms
2、插入排序
插入排序不是通过交换位置而是通过比较找到合适的位置插入元素来达到排序的目的的。相信大家都有过打扑克牌的经历,特别是牌数较大的。在分牌时可能要整理自己的牌,牌多的时候怎么整理呢?就是拿到一张牌,找到一个合适的位置插入。这个原理其实和插入排序是一样的。举个栗子,对5,3,8,6,4这个无序序列进行简单插入排序,首先假设第一个数的位置时正确的,想一下在拿到第一张牌的时候,没必要整理。然后3要插到5前面,把5后移一位,变成3,5,8,6,4.想一下整理牌的时候应该也是这样吧。然后8不用动,6插在8前面,8后移一位,4插在5前面,从5开始都向后移一位。注意在插入一个数的时候要保证这个数前面的数已经有序。简单插入排序的时间复杂度也是O(n^2)。
def insertSort(a):
start_time = time.time()*1000
for i in range(1, len(a)):
j = i
while j>0 and a[