在技術排序中,如果元素的範圍比較(比如 在1到1億之間),如何改造演算法
桶排序(bucket sort): 首先將元素分在不同的桶中,在對每個桶中的元素排序
n 表示預設分成多少桶
乙個桶放 (max_num // n)的數
(var // (max_num // n)得0放到0號桶裡,得1放到1號桶裡
當max_num=10000 => min(var // (max_num // n), n-1) 取最小99的
#!
/usr/bin/env python
# -*
- coding: utf-8-
*-# date: 2017/12/10
import random
#li是列表
def bucket_sort
(li, n=
100, max_num=
10000):
#桶本身就是乙個列表 2倍列表
buckets =[[
]for _ in range
(n)] # 建立桶
for var in li:
#乙個桶放 (max_num // n)的數 (var // (max_num // n)得0放到0號桶裡,得1放到1號桶裡
i =min(var // (max_num // n), n-1) # i 表示var放到幾號桶裡
buckets[i]
.(var) # 把var加到桶裡邊
#[0,
2,4,
1] 保持桶內的順序
for j in range
(len
(buckets[i])-
1,0,
-1):
#j(1)小於前面的元素 1和4比較
if buckets[i]
[j]< buckets[i]
[j-1]:
#交換buckets[i]
[j], buckets[i]
[j-1
]= buckets[i]
[j-1
], buckets[i]
[j]else
:break
sorted_li =
for buc in buckets:
#數加到列表後面
sorted_li.
extend
(buc)
return sorted_li#0-
100 迴圈100個數
桶排序的表現取決於資料的分布,也就是需要對不同資料排序時採取不同的分桶策略
平均情況時間複雜度:o(n+k)
最壞情況的時間複雜度:o(n2k)
空間複雜度:o(nk)
Python實現桶排序
實現範圍為1 m的桶排序 對於陣列a,包含n個整數,值從1到m,我們可以利用一種非常快速的排序,桶排序 bucket sort 建立乙個陣列s,裡面含有m個桶,初始化為0。然後遍歷陣列a,讀入ai時,s ai 增一。所有輸入被讀進後,掃瞄陣列s得出排好序的表。該演算法時間花費o m n 空間上不能原...
python 實現桶排序
桶排序我知道思想,但是一直沒有自己實現過,我今天特地實現了乙個版本,主要思想是分桶,設定每個桶的範圍,然後把數對映到每個桶內,然後每個桶排序後進行合併就行了。class solution def init self super init def bucketsort self,nums,bucket...
python與桶排序
問題提出 將以下資料 6,8,2,3,4,0,9,1,5,1 按從小到達排列。桶排序原理 桶排序也叫計數排序,簡單來說,就是將資料集裡面所有元素按順序列舉出來,然後統計元素出現的次數。最後按順序輸出資料集裡面的元素。排序過程如下 一 初始化桶的大小 把資料集裡面每乙個元素當作乙個桶,由上面問題看出,...