排序算法的复杂度总结表
几种常见排序算法的特点:(图片转载于link)
快速排序时间复杂度为O(nlog2n)
1) 快速排序的实现(Quick Sort)
快速排序的时间复杂度是 O(nlogn),并且它在时间复杂度为 O(nlogn)级的几种排序算法中,大多数情况下效率更高,所以快速排序的应用非常广泛。再加上快速排序所采用的分治思想非常实用,使得快速排序深受面试官的青睐,所以掌握快速排序的思想尤为重要。
快速排序的方法:
1.从数组中取出一个数,称之为基数(pivot)
2.遍历数组,将比基数大的数字放到它的右边,比基数小的数字放到它的左边。遍历完成后,数组被分成了左右两个区域
3.将左右两个区域视为两个数组,重复前两个步骤,直到排序完成
(图片转载于link)
第一轮遍历排好 1 个基数,第二轮遍历排好 2 个基数(每个区域一个基数,但如果某个区域为空,则此轮只能排好一个基数),第三轮遍历排好 4 个基数(同理,最差的情况下,只能排好一个基数),以此类推。总遍历次数为 logn~n 次,每轮遍历的时间复杂度为 O(n),所以很容易分析出快速排序的时间复杂度为 O(nlogn)~ O(n^2) ,平均时间复杂度为 O(nlogn)。
def QuickSort(a:list):
# 设计一个实现分区的函数
def partition(arr,left,right):
cir=left
while left<right:
while left < right and arr[right] >= arr[cir]:
right-=1
while left < right and arr[left] <= arr[cir]:
left+=1
(arr[left],arr[right])=(arr[right],arr[left])
(arr[left], arr[cir]) = (arr[cir], arr[left])
index=left
return index
# 快排,用到了递归
def quicksort(arr,left,right):
if left>=right:
return 0
mid=partition(arr,left,right)
quicksort(arr,left,mid-1)
quicksort(arr,mid+1,right)
n=len(a)
if n<=1:
return a
quicksort(a,0,n-1)
return a
x=list(map(int,input('请输入待排序数列,并以' '隔开:\n').strip().split(' ')))
arr=QuickSort(x)
print('排列结果如下:')
for k in arr:
print(k,end=' ')
转载请注明:Daniel的博客