时间排序python_算法导论 第八章 线性时间排序(python)
比較排序:各元素的次序依賴于它們之間的比較{插入排序O(n**2) 歸并排序O(nlgn) 堆排序O(nlgn)快速排序O(n**2)平均O(nlgn)}
本章主要介紹幾個線性時間排序:(運算排序非比較排序)計數排序O(k+n)基數排序O()
第一節:用決策樹分析比較排序的下界
決策樹:倒數第二層滿,第一層可能滿的二叉樹,它用來表示所有元素的比較操作{于此來分析下界},忽略控制,移動操作
1:2 #A[1]和A[2]比 <= 走左邊 >走右邊
<3,1,2> 最后的結果 下標對應排序順序
如A=[5,6,4]-->1:2 <=? -->2:3 > -->1:3 > ---><3,1,2>[4,5,6]
看圖可知有6鐘可能的對比3!(也就是n!)
高度是他要對比的次數h = ?(n lg n)
n! <= 2**h#數據結構內容
推出8.2:堆排序和歸并排序都是漸進最優的比較排序算法
二計數排序
基本思想:對于每個元素x,確定小于x的元素個數
適用范圍:小范圍 x的跨度比較小的整數排序#跨度過大如0-1000輔助函數C[1000]
穩定性:穩定
時間復雜度:Θ(k+n)
實現:
defCOUNTING_SORT(A,B,k):#A要排序的函數
#B保存排序后的結果
#k A中x的最大值 [0,k]
C= list() #臨時保存記錄x前面的個數
for i in range(k+1):#[0,k]
C.append(0)for j inrange(len(A)):
C[A[j]]+= 1 #記錄A[j] == i C[i]記一個數 這是一個轉換 似于hash的思想
for i in range(1,k+1):
C[i]= C[i] + C[i-1] #計算小于x的元素個數
for j in range(len(A)-1,-1,-1): #從后想前借B排序[0,len(A))
#print(C[A[j]])
B[C[A[j]]-1] = A[j] #B下標從0開始
C[A[j]] -= 1
if __name__ == "__main__":
A= [2,5,3,0,2,3,0,3]
B=list()for i in range(len(A)): #B初始化?還有沒有別的方法
B.append(0)
COUNTING_SORT(A,B,5)print(B)'''>>>
============= RESTART: F:/python/algorithms/8_2_counting_sort.py =============
[0, 0, 2, 2, 3, 3, 3, 5]
win7 python3.5.1'''
8.3基數排序(radix sort)
基本思想:按關鍵字的各個值來排序
穩定性:穩定
基數排序:一位一位的對比排序(msd)
arr =list()
res=list()
hash=list()
n=int()defmaxbit():
_max=0
temp=list()for i inarr:
temp.append(i)for i inrange(n):
tt= 1
while (temp[i] //10) >0:
tt+= 1temp[i]//= 10
if _max
_max=ttprint("最大%d位"%_max)return_maxdefradixSort():for i inrange(n):
res.append(0)#初始化為0
nbit = maxbit() #最大的數有多少位
radix = 1
#計數排序
for j in range(10):
hash.append(0)for i in range(1,nbit+1):#[1,3]
for j in range(10):
hash[j]=0for j inrange(n):
tmp= (arr[j]//radix) % 10hash[tmp]+= 1
for j in range(1,10):
hash[j]+= hash[j-1]for j in range(n-1,-1,-1):
tmp= (arr[j]//radix) %10hash[tmp]-= 1
#print(hash[tmp])
res[hash[tmp]] =arr[j]for j inrange(n):
arr[j]=res[j]print(arr)
radix*= 10;if __name__ == "__main__":
n= int(input("輸入元素個數:"))print("輸入%d個元素"%n)for i inrange(n):
arr.append(int(input("第"+str(i+1)+'個:')))
radixSort()print("排序后",arr)'''============== RESTART: F:/python/algorithms/8_3_radix_sort.py ==============
輸入元素個數:5
輸入5個元素
第1個:54321
第2個:1
第3個:4321
第4個:21
第5個:321
最大5位
[54321, 1, 4321, 21, 321]
[1, 54321, 4321, 21, 321]
[1, 21, 54321, 4321, 321]
[1, 21, 321, 54321, 4321]
[1, 21, 321, 4321, 54321]
排序后 [1, 21, 321, 4321, 54321]
>>>
環境:win7 + python3.5.1'''
8.4桶排序
思想:同hash = n //x
穩定性:
defbucketSort(a,max):#a 待排序list
#數組中的最大值的范圍
if len(a) == 0 and max <1:returnbuckets= list() #建立容納max個數的list
for i inrange(max):
buckets.append(0)#初始化
#計數
for i inrange(len(a)):
buckets[a[i]]+= 1
#排序
j =0for i inrange(max):while buckets[i] >0:
buckets[i]-= 1a[j]=i
j+= 1
if __name__ == "__main__":
a= [8,2,3,4,3,6,6,3,9]print("排序前a:",a)
bucketSort(a,10) #桶排序
print("排序后a:",a)'''============== RESTART: F:/python/algorithms/8_4_bucket_sort.py ==============
排序前a: [8, 2, 3, 4, 3, 6, 6, 3, 9]
排序后a: [2, 3, 3, 3, 4, 6, 6, 8, 9]
>>>
win7 + python3.5.1'''
參考引用:
總結
以上是生活随笔為你收集整理的时间排序python_算法导论 第八章 线性时间排序(python)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python中字典的find_pytho
- 下一篇: python 拼多多秒杀_关于 拼多多笔