(另有动态演示、其他语言版本,留言私信发链接)
首先,简单说一下排排序算法(如图,8大基本排序算法)
一 直接插入排序
时间复杂度:O(n^2)
思路:
整个列表分为两部分,一部分有序区[0,i-1],无序区[i,len-1],从无序区第一个元素key=list[i]开始,与序区元素从后往前依次进行比较;若key小于有序区某一元素list[j],则该有序区某一元素后移一位。即:list[j+1]=list[j],直到找到已排序的元素小于或者等于key的位置
实现代码:
list=[2,1,3,6,4]
for i in range(1,len(list)):
key=list[i]
j=i-1
while j>=0 and key<list[j]:
list[j+1]=list[j]
j=j-1
list[j+1]=key
print(list)
二 直接选择排序
时间复杂度:O(n^2)
思路:第一次从R[0]~R[n-1]中选取最小值,与R[0]交换,第二次从R[1]~R[n-1]中选取最小值,与R[1]交换,....,第i次从R[i-1]~R[n-1]中选取最小值,与R[i-1]交换,.....,第n-1次从R[n-2]~R[n-1]中选取最小值,与R[n-2]交换,总共通过n-1次,得到一个按排序码从小到大排列的有序序列。
实现代码:
list=[2,1,3,6,4]
for i in range(0,len(list)-1):
k=i
for j in range(i+1,len(list)):
if list[k]>list[j]:
k=j
list[k],list[i]=list[i],list[k]
print(list)
三 交换排序之冒泡排序
平均时间复杂度:
思路:对列表中相邻两个元素进行比较,较大的数永远会排在较后面,对每个元素重复执行,直至把队列按从小到大的顺序排列整齐
实现代码:O(n^2)
list=[2,1,3,6,4]
for i in range(0,len(list)-1):
for j in range(0,len(list)-1-i):
if list[j+1]<list[j]:
list[j+1],list[j]=list[j],list[j+1]
print(list)
四 交换排序之快速排序
平均时间复杂度:O(nlogn)
思路:快速排序是对冒泡排序的一种改进。通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
实现代码:
def qsort(list,start,end):
if start<end:
i,j=start,end
center=list[i]
while i<j:#每循环一次,就把整个队列分为两个部分,一部分大于center,一部分小于center
while i<j and center<=list[j]:
j=j-1
list[i]=list[j]#不满足while的判断条件,跳出置换位置
while i<j and center>=list[i]:
i=i+1
list[j]=list[i]#不满足while的判断条件,跳出置换位置
list[i]=center#循环结束之后,补上空余位置
qsort(list,start,i-1)#递归调用qsort方法,执行第二次循环
qsort(list,j+1,end)
return list
list=[4,3,5,1,2,7]
qsort(list,0,len(list)-1)
print(list)
尽情留言说出不足