排序算法一:冒泡排序
冒泡排序
冒泡排序需要数据交换位置,所以属于交换排序的一种。
算法原理
对输入数组进行排序,以升序数组为例,对数组进行遍历,比较相邻两个数,将大值移动到后面,遍历完第一次之后能保证最大值放到后面,然后依次递减数组遍历的长度直到数组完全有序。
import random
import time
def bubble_sort(array):
for i in range(len(array)-1): #总共进行len(array)-1次遍历
for j in range(len(array) - i - 1): #每次遍历要遍历len(array)-i-1个数
if array[j] > array[j+1]: #位置相反,交换位置
array[j], array[j+1] = array[j+1],array[j]
return array
#生成10000个值在0~10000的随机数
myList=[random.random()*10000 for i in range(10000)]
start_time=time.time()
print(bubble_sort(myList))
#统计使用时间
print(f"--- {time.time() - start_time} seconds ---")
最后排序10000个数,需要9.975126028060913秒。
改进
我们直知道,如果数据后面完全是有序的,那么if array[j] > array[j+1]:就不会成立,这样的话,我们整个数组就是有序的,可以直接返回了,我们可以设置一个标志位flag,来判断数据是否有序。
import random
import time
def bubble_sort(array):
for i in range(len(array)-1): #总共进行len(array)-1次遍历
flag = False
for j in range(len(array) - i - 1): #每次遍历要遍历len(array)-i-1个数
if array[j] > array[j+1]: #位置相反,交换位置
flag=True #如果这个地方flag不出现的话,flag就是False,那么最后进行判断就可以返回。
array[j], array[j+1] = array[j+1],array[j]
if not flag:
return array
return array
#生成10000个值在0~10000的随机数
myList=[random.random()*10000 for i in range(10000)]
start_time=time.time()
print(bubble_sort(myList))
#统计使用时间
print(f"--- {time.time() - start_time} seconds ---")
这个用时是10.090549945831299,这是因为数据比较凌乱,这样的改进适合于数据较为规整的情况。
复杂度分析
最好的情况下,数组是正序的,一次排序,所有的数字都比较了N-1次,这个情况下,时间复杂度为O(N)。
最坏的情况下,数组是反序的,需要进行N-1次排序,并且每次比较都需要比较N-i-1次,移动次数就是比较次数的3倍,所以最坏情况下,比较次数和移动次数都是O(N^2),平均时间复杂度为O(^2)。因为移动的时候相当于引入temp变量存储临时位置,所以空间复杂度为O(1)。