参考网站:(https://mp.weixin.qq.com/s/VX9LwTK77RUPLBFHPS1Z1A)
1.选择排序:原理:选择列表中最小的元素,每次挪动最小的到最左边,依次进行。
def SelectSort(alist):
n=len(alist)
for i in range(n-1):
min_index=i
for j in range(i+1,n):
if alist[j] < alist[min_index]:
min_index=j
alist[i],alist[min_index]=alist[min_index],alist[i]
print alist
SelectSort([3,5,38,15,36,55,2])
2.冒泡排序:原理:从左往右二二比较,一轮将最大的元素挪到最右边,依次下去
def bubbleSort(alist):
n = len(alist)
for i in range(n-1, 0, -1):
for j in range(0, i):
if alist[j] > alist[j+1]:
alist[j], alist[j+1] = alist[j+1], alist[j]
print alist
bubbleSort([3,5,38,15,36,55,2])
优化:有得时候没有完全遍历,已经排列成功。
def bubbleSort(alist):
n = len(alist)
exchange = False
for i in range(n-1, 0, -1):
for j in range(0, i):
if alist[j] > alist[j+1]:
alist[j], alist[j+1] = alist[j+1], alist[j]
exchange = True
if not exchange :
break
print alist
bubbleSort([3,5,38,15,36,55,2])
3.插入排序: 插入排序的算法复杂度仍然是O(n2),但其工作原理稍有不同。它总是保持一个位置靠前的 已排好的子表,然后每一个新的数据项被“插入”到前边的子表里,排好的子表增加一项。我们认为只含有一个数据项的列表是已经排好的。每排后面一个数据(从1开始到n-1),这 个的数据会和已排好子表中的数据比较。比较时,我们把之前已经排好的列表中比这个数据大的移到它的右边。当子表数据小于当前数据,或者当前数据已经和子表的所有数据比较了时,就可 以在此处插入当前数据项。
def insertionsort(alist):
n = len(alist)
for i in range(1,n):
temp=alist[i] #被插入
for j in range(i,0,-1):
if (temp < alist[j-1]):
alist[j]=alist[j-1]
else:
break
alist[j-1]=temp
print alist
insertionsort([3,5,38,15,36,55,2])