- 桶排序
- 原理:
將數組分到有限數量的桶裏。每個桶再個別排序(有可能再使用別的排序算法或是以遞歸方式繼續使用桶排序進行排序),最後依次把各個桶中的記錄列出來記得到有序序列。桶排序是鴿巢排序的一種歸納結果。
桶排序適合用在外部排序,例如數據量較大內存中放不下就可以,用到桶排序。按照數據特徵將數據分爲m個有順序的桶,在桶排序後合併即可。例如一年的10G的淘寶訂單數據,按時間排序。但是我們的內存只有1G。可以將訂單數據根據時間放入12個桶中,每個桶代表一個月份。將一月分的數據放入一月份的桶中。以此類推。再對同內數據進行快速排序,然後合併即可。(有的月份訂單比較多比如十一月份因雙十一的原因,有2G的訂單數據。這種情況將桶再細分就可以了)
-
- 分析:
排序的數據有n個,我們分成m個桶,每個桶中就有k = n/m個元素
空間複雜度:O(n+m)
時間複雜度:桶內用快速排序所以T(n) = n + m*k*logk
由k = n/m得T(n) = n + n * log(n/m)
=n+n(logn - logm)
當m趨近於n時T(n)=O(n)
- 計數排序
- 原理:
需要三個數組,一個原始數據,一個數組負責計數。一個負責將計數後的數據存入輸出說的有點抽象看代碼吧
-
- 代碼:
#encoding:utf-8
def run(lis):
#定義變量
max_num = 0
re = 0
index = len(lis)
#臨時數組
result = [None] * index
#取出數組中最大值
for i in lis:
if i > max_num:
max_num = i
#根據最大值定義一個新的數組
lis_b = [0 for x in range (max_num + 1)]
#原始數組中取出數據,並在計數數組中相應下標中的數據加一
for i in lis:
lis_b[i] += 1
#將數據計數累計計數
for i in range(1,max_num +1):
lis_b[i] = lis_b[i - 1] + lis_b[i]
#從後往前遍歷原始數組,根據計數數組將元素放入相應位置
for i in range(index-1,-1,-1):
result[lis_b[lis[i]] - 1] = lis[i]
lis_b[lis[i]] = lis_b[lis[i]] - 1
lis = result
return lis
-
- 分析:
空間複雜度:O(n+K) k爲要排序數據的最大值
時間複雜度:O(n+k)
- 基數排序
- 原理:基數排序比較簡單看圖吧
-
- 分析:看圖
堆排序在堆之後再寫