桶排序原理:
將陣列分到有限數量的桶裡。每個桶再個別排序(有可能再使用別的排序演算法或是以遞迴方式繼續使用桶排序進行排序),最後依次把各個桶中的記錄列出來記得到有序序列。桶排序是鴿巢排序的一種歸納結果。
桶排序適合用在外部排序,例如資料量較大記憶體中放不下就可以,用到桶排序。按照資料特徵將資料分為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)
基數排序原理:基數排序比較簡單看圖吧
分析:看圖
堆排序在堆之後再寫
資料結構和演算法 Day 3
演算法效率的度量方法 1 事後統計法 這種方法主要是通過設計好的測試程式和資料,利用計算機計時器對不同演算法編制的程式的執行時間進行比較,從而確定演算法效率的高低。2 事前分析估算法 在電腦程式編寫前,依據統計方法對演算法進行估算。影響高階語言程式執行時間的因素 1 演算法採用的策略,方案 2 編譯...
資料結構和演算法 排序演算法day1
排序演算法的執行效率 1 時間複雜度的最好,最壞,平均情況 2 時間複雜度的係數,常數,低階 3 比較次數和交換次數 2 排序演算法的記憶體消耗 我們可以通過空間複雜度來衡量 排序演算法的穩定性 穩定性就是經過排序之後,相等的元素的先後順序不改變 這裡只些一些常用的排序演算法如 氣泡排序 插入排序 ...
《大話資料結構》筆記 day3
獲得鍊錶的第i個資料的思路 宣告乙個結點 p 指向鍊錶第乙個結點,初始化 j 從 1 開始 當j i 時,就遍歷鍊錶,讓p的指標向後移動,不斷指向下一結點,j 累加 1 若到鍊錶末尾 p 為空,則說明第 i 個元素不存在 否則查詢成功,返回結點 p 的資料 核心思想 工作指標後移 插入 s next...