排序算法-桶排序
桶排序 (Bucket sort)的工作的原理:
假設輸入數據服從均勻分布, 將數據分到有限數量的桶里,每 個桶再分別排序(有可能再使用 別的排序算法或是以遞歸方式繼 續使用桶排序進行排序
?
編程思路
1、初始化桶的大小為K
2、獲取 n 個數據中的最大值 max,最小值 min
3、將數據放入到 n/K +1 個桶中,a[i] 放入哪個桶的規則為 (a[i]-min)/k
4、對 n/K 個桶分別進行快速排序并輸出。
import randomdef quick_sort(data_list):length = len(data_list)quick_sort_c(data_list, 0, length - 1)def quick_sort_c(data_list, begin, end):if begin >= end:returnelse:index = partition(data_list, begin, end)quick_sort_c(data_list, begin, index - 1)quick_sort_c(data_list, index + 1, end)def partition(data_list, begin, end):partition_key = data_list[end]index = beginfor i in range(begin, end):if data_list[i] < partition_key:data_list[i], data_list[index] = data_list[index], data_list[i]index += 1data_list[index], data_list[end] = data_list[end], data_list[index]return indexdef find_top_k(data_list, k):length = len(data_list)begin = 0end = length - 1index = partition(data_list, begin, end)while index != length - k:if index > length - k:end = index - 1index = partition(data_list, begin, end)else:begin = index + 1index = partition(data_list, index + 1, end)return data_list[index]def bucket_sort(data_list, bucket_size=5):length = len(data_list)min_ = max_ = data_list[0]# 尋找最小值和最大值for i in range(0, length):if data_list[i] < min_:min_ = data_list[i]if data_list[i] > max_:max_ = data_list[i]# 定義多個桶num_of_buckets = (max_ - min_) // bucket_size + 1buckets = [[] for _ in range(num_of_buckets)]# 將數據放入桶中for i in range(0, length):buckets[(data_list[i] - min_)//bucket_size].append(data_list[i])# 依次對桶內數據進行快速排序data_list.clear()for i in range(num_of_buckets):quick_sort(buckets[i])for data in buckets[i]:data_list.append(data)data_list = [random.randint(0, 100) for i in range(10)] print(data_list) bucket_sort(data_list) print(data_list)桶排序適用場景
桶排序適合外部排序,外部排序就是數據在內存之外,比如磁盤上,數據量比較大,無法 一次性讀入內存。
舉個例子,假如老板給你一份 10 GB 大小的文件,是訂單的交易明細數 據,要求你按訂單金額從大到小排序,而你的內存內有 4GB,實際可用內存只有 2 GB, 那么此時就是桶排序發揮作用的時候了。
1. 將文件逐行讀入內存(幾乎每個編程語言都可 以),掃描并記錄最小值,最大值,假如最小值為 1 元,最大值為 10 萬元,且都為整數, 不是整數也沒關系,可以先乘以 100 換成整數,排序后再除以 100 還原。
總結