1.快速排序(nlogn,速度最快,但极端情况下,速度很慢n^2)
# 开发时间: 19:27
'''快速排序代码实现'''
import random
import sys
sys.setrecursionlimit(10000) #设置跌点深度
def partition(li,left,right): #归位函数
temp=li[left] #将第一个元素存起来
while left<right:
while left<right and li[right]>=temp: #从右往左找,比第一个元素小的存到左边
right-=1
li[left] = li[right]
while left<right and li[left]<=temp: #从左往右找,比第一个元素大的存到右边
left+=1
li[right]=li[left]
li[right]=temp
return left
def quick_sort(li, left,right): #排序函数
if left<right:
mid=partition(li,left,right) #将区间一分为二
quick_sort(li,left,mid-1) #对左边的归位,并划分区间
quick_sort(li,mid+1,right) #对右边的归位,并划分区间
return li
li=[random.randint(0,100) for i in range(10)]
#li=[6,5,4,3,7,9,8,1,2]
print(li)
quick_sort(li,0,len(li)-1)
print(li)
2.堆排序(nlogn,三者中速度最慢,heaq内置排序)
# 开发时间: 15:54
import random
def sift(li,low,high): #堆的向下调整函数
i=low #父指针
j=2*i+1 #左孩子指针
temp=li[low] #存起来根
while j < high:
if j+1<=high and li[j]<li[j+1]: #判断左右孩子哪个大
j=j+1 #将指针指向孩子大的数
if temp<li[j]: #判断父和大孩子的大小
li[i]=li[j]
i=j
j=2*i+1
else:
break
li[i]=temp #归位
def heap_sort(li): #建堆函数
n=len(li)
for i in range(n//2-1,-1,-1): #从最后建起
sift(li,i,n-1)
print(li)
for i in range(n-1,-1,-1):
li[0],li[i]=li[i],li[0]
sift(li,0,i-1)
print(li)
li=[i for i in range(100)]
random.shuffle(li)
print(li)
heap_sort(li)
'''内置函数建堆并排序'''
import heapq #优先队列
li1=[i for i in range(100)]
random.shuffle(li1)
print(li1)
heapq.heapify(li1) #建堆
n=len(li1)
for i in range(n):
print(heapq.heappop(li1)) #每次打印堆中最小值
3.归并排序(nlogn,python内置排序采用的方法,递推关系)
# 开发时间: 17:08
import random
def merge(li,low,mid,high):
i=low
j=mid+1
tmp=[]
while i<=mid and j<=high:
if li[i]<li[j]:
tmp.append(li[i])
i += 1
else:
tmp.append(li[j])
j+=1
while i<=mid:
tmp.append(li[i])
i+=1
while j<=high:
tmp.append(li[j])
j+=1
li[low:high+1]=tmp
def merge_sort(li,low,high):
mid=(low+high)//2
if low <high:
merge_sort(li,low,mid)
merge_sort(li,mid+1,high)
merge(li,low,mid,high)
li=[i for i in range(100)]
random.shuffle(li)
merge_sort(li,0,len(li)-1)
print(li)
三者之间的关系: