日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

时间排序python_算法导论 第八章 线性时间排序(python)

發布時間:2025/4/16 python 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 时间排序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)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。