排序NB三人组:
快速排序
堆排序
快速排序
堆排序
归并排序
三种排序算法的时间复杂度都是O(nlogn)
一般情况下,就运行时间而言:
快速排序 < 归并排序 < 堆排序
三种排序算法的缺点:
快速排序:极端情况下排序效率低
归并排序:需要额外的内存开销
堆排序:在快的排序算法中相对较慢
一、快速排序思路:
取一个元素p(第一个元素),使元素p归位;
列表被p分成两部分,左边都比p小,右边都比p大;
递归完成排序。
图解:
第一步:挑选一个值mid,使列表左边值小于mid,右边的值大于mid
第二步:拿到归位后的列表,进行递归排序
代码实现:
li=[5,7,4,6,3,1,2,9,8]
def partition(li,left,right):
while left < right:
while left < right and li[left] < li[right]:
right-=1
li[left],li[right] = li[right],li[left]
while left < right and li[left] < li[right]:
left+=1
li[left], li[right] = li[right], li[left]
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)
quick_sort(li,0,len(li)-1)
图解:
代码实现:
li=[5,7,4,6,3,1,2,9,8]
def merge(li,left,mid,right):
i=left
j=mid +1
ltmp = []
while i <= mid and j<=right:
if li[i] < li[j]:
ltmp.append(li[i])
i+=1
else:
ltmp.append(li[j])
j+=1
while i <= mid :
ltmp.append(li[i])
i+=1
while j <=right :
ltmp.append(li[j])
j+=1
li[left:right+1]=ltmp
def merge_sort(li,left,right):
if left < right:
mid = (left+right)//2
merge_sort(li,left,mid)
merge_sort(li,mid+1,right)
merge(li, left, mid, right)
merge_sort(li,0,len(li)-1)