QQ:3020889729 小蔡
特別聲明
本文采用jupyter notebook演示,請注意移植代碼的整合問題。
排序優點
序號 | 優點 |
---|---|
1 | 應用於整數排序,速度快 |
2 | 對於內存消耗比較大,使用時需要確定桶大小 |
算法思想
假定存在一個a[n]序列,n=101:那麼a序列就包含a[0]-a[100]的元素——稱爲桶。
這時排序一些數字,如[1, 2, 3, 9, 7, 0], 就只需要將其中的數字對應的桶元素標記+1即可。
將排序的數字對應標記到桶a[n]中後,只需要按a[n]是否被標記,標記次數來依次輸出標號n,就是排序後的數據了。
代碼實現
引入numpy庫,實現序列的初始化(zeros)
import numpy as np
定義桶大小
# 定義桶的大小:一般來說,建議比排序的最大整數大1即可:0~n book_size=n+1
book_size = 101
處理數據輸入和標記桶(三種數據輸入的處理方法,選其中一個即可)
1.指定排序個數
# 指定排序個數
n = int(input("請輸入排序的個數:"))
book = np.zeros(book_size) # 初始化桶大小
t = [] # 記錄實際所需排序數據
for i in range(n):
x = int(input()) # 將輸入數據(input輸入的數據爲字符)轉換爲int
t.append(x)
book[x] += 1 # 每一次輸入的數,對應元素標記加1
print("生成的有效數據爲:",t)
結果展示:
2.任意的排序個數
# 所有排序的數據由一行輸入,不確定的排序個數(但排序最大數小於桶大小-1)
t = input("請輸入需要排序的數字:").split(' ') # 將輸入劃分成list
book = np.zeros(book_size) # 初始化桶大小
for i in range(len(t)): # input輸入返回的是字符串,所以進行轉化
t[i] = int(t[i])
book[t[i]] += 1 # 標記出現的數字
print("生成的有效數據爲:",t)
結果展示:
(提示:輸入數據的格式,每個數字以空格隔開,結束輸入按下回車即可)
3.預設排序個數,允許低於預設個數的排序
# 確定預排序個數,但是允許實際排序個數低於預設個數
n = int(input("請輸入排序的個數:"))
t = input("請輸入需要排序的數字:").split(' ') # 將輸入劃分成list
book = np.zeros(book_size) # 初始化桶大小
if len(t) > n: # 輸入個數大於待排序個數時,進行前取n個數據
t = t[:n]
for i in range(len(t)):
t[i] = int(t[i])
book[t[i]] += 1 # 標記出現的數字
print("生成的有效數據爲:",t)
結果展示:
①預設個數等於排序個數
②預設個數大於實際排序個數
③預設個數小於實際排序個數
將桶按指定方向輸出
for i in range(book_size): # 通過遍歷桶實現排序輸出
j = 1 # j判斷桶是否有被標記,標記多少次 j = 次數
while(j <= book[i]): # 當桶中對應的標籤標記 >= j 時就輸出當前的桶編號
j += 1
print(i,end=" ")
結果展示: