python算法實踐——簡化桶排序

                         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=" ")

結果展示:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章