时间复杂度O(n)
1.冒泡排序
(1)比较相邻的元素。如果第一个比第二个大,就交换它们两个
(2)对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数
(3)针对所有的元素重复以上的步骤,除了上次的最后一位
#!/usr/bin/python3
lst=[1,9,8,5,6,7,4,3,2]
for i in range(len(lst)):
for j in range(len(lst)-1-i):
if lst[j]>lst[j+1]:
lst[j],lst[j+1]=lst[j+1],lst[j]
print(lst)
优化后:
#!/usr/bin/python3
lst=[1,9,8,5,6,7,4,3,2]
for i in range(len(lst)):
flag=False
for j in range(len(lst)-1-i):
if lst[j]>lst[j+1]:
lst[j],lst[j+1]=lst[j+1],lst[j]
flag=True
if not flag:
break
print(lst)
优化后降低了运算次数,提高了运算及效率
2.选择排序
n个记录的直接选择排序可经过n-1趟直接选择排序得到有序结果。
#!/usr/bin/python3
import time
nums=[1,9,8,5,6,7,4,3,2]
for i in range(len(nums)):
minindex=i
for j in range(i+1,len(nums)):
if nums[i]>nums[j]:
minindex=j
if minindex!=i:
nums[i],nums[minindex]=nums[minindex],nums[i]
print(nums)
优化后
倒序排列
#
#!/usr/bin/python3
import time
lst=[1,9,8,5,6,7,4,3,2]
for i in range(len(lst)//2):
maxindex=i
minindex=-i-1
for j in range(i+1,len(lst)):
if lst[maxindex]<lst[j]:
maxindex=j
if lst[minindex]>lst[-j-1]:
mindex=-j-1
if i!=maxindex:
lst[i],lst[maxindex]=lst[maxindex],lst[i]
if i==minindex or i==len(lst)+minindex:
minindex=maxindex
if -i-1!=minindex:
lst[-i-1],lst[minindex]=lst[minindex],lst[-i-1]
print(lst)
顺序排列(只是改变了条件中大小符号)
#
#!/usr/bin/python3
import time
lst=[1,9,8,5,6,7,4,3,2]
for i in range(len(lst)//2):
maxindex=i
minindex=-i-1
for j in range(i+1,len(lst)):
if lst[maxindex]>lst[j]:
maxindex=j
if lst[minindex]<lst[-j-1]:
mindex=-j-1
if i!=maxindex:
lst[i],lst[maxindex]=lst[maxindex],lst[i]
if i==minindex or i==len(lst)+minindex:
minindex=maxindex
if -i-1!=minindex:
lst[-i-1],lst[minindex]=lst[minindex],lst[-i-1]
print(lst)
3.插入排序
和冒泡思想差不多,就是依次和前边比但是不用每次换位,找到合适位置一次插入即可
#!/usr/bin/python3
import random
lst=[1,9,8,5,6,7,4,3,2]
for i in range(1,len(lst)):
tempnum=lst[i]
j=i-1
while tempnum<lst[j]:
lst[j+1]=lst[j]
j-=1
if j<0:
break
lst[j+1]=tempnum
print(lst)