1.桶排序
桶排序是設計一定數值範圍的桶,將屬於這個範圍的數值放在桶中,然後將元素在每個桶中排序,再按照桶的順序輸出桶中的排序。
def
tong_sort
(nums)
: start =
min(nums)
end =
max(nums)
tong =
(end - start)
//len
(nums)
tong_list =[[
]for i in
range
(len
(nums)+1
)]for i in nums:
tong_list[
int(
(i-start)
//tong)
] nums.clear(
)for i in tong_list:
for j in quick_sort(i)
:return nums
defquick_sort
(nums):if
len(nums)
<2:
return nums
mid = nums[0]
left =
right =
for i in nums[1:
]:if i <= mid:
else
:return quick_sort(left)
+[mid]
+quick_sort(right)
當待排序陣列的差過小時出現問題
2.計數排序
計數排序按照我的理解就是將無序陣列中的值將其出現的次數儲存到新陣列中,然後列印次數不為零的數值,有多少次列印多少個
無序陣列:[8,5,6,5,3,2,2,9]初始陣列:[0,0,0,0,0,0,0,0,0,0]
出現次數:[0,0,2,1,0,2,1,0,1,1]
def
count_sort
(nums):if
len(nums)
<2:
return nums
s =arr =[0
for _ in
range
(max
(nums)+1
)]for i in nums:
arr[i]+=1
for i in
range
(len
(arr)):
if arr[i]!=0
:for j in
range
(arr[i]):
return s
3.基數排序基數排序是先根據陣列元素個位大小排序,再用剛剛排序一輪的陣列根據元素十位大小排序,依次類推。
這張圖還是不太好看,下面是菜鳥教程的圖,菜鳥教程傳送門
# 記錄最大值的位數
for x in
range
(n):
#最大值位數輪排序
lis =[[
]for i in
range(10
)]#每一位數字都是0到9
for i in arr:
lis[i//(10
**x)%10
]#把數值按照個位或十位的的大小儲存到對應的陣列位置上
# print(lis)
#下面的功能是:因為陣列有些位置上是由多個相同個位組成的陣列,所有需要對整個陣列排序 [, [81, 41], [62], [23], , , [16], [37], , [59]]
arr =
for i in lis:
for j in i:
return arr
三種排序的區別:
桶排序:劃分元素範圍將範圍內的元素放在乙個桶,桶內再排序,按桶的順序輸出
計數排序:將元素出現的次數計數,有幾次輸出幾次
基數排序:按元素的個位大小(相同個位儲存在同一陣列中),將剛剛個位排序的陣列再按十位大小排序
桶排序 基數排序 計數排序
桶排序 1.原理 將需要排序的陣列分在有限的桶裡 然後對每個桶中的數分別排序 對每個桶的操作 1.別的排序演算法 2.以遞迴的方式繼續使用桶排序 2.過程 假設待排序的一組數統一的分布在乙個範圍中,並將這一範圍劃分成幾個子範圍,也就是桶 將待排序的一組數,分檔規入這些子桶,並將桶中的資料進行排序 將...
排序 基數排序(計數排序 桶排序)
在此對於桶排序做出兩種方法 一.簡化版桶排序 如下 簡化版的桶排序 include int main scanf d n 輸入乙個數n,表示接下來有n個數 for i 1 i n i 迴圈讀入n個數,並進行桶排序 for i 0 i 1000 i 依次判斷編號1000 0的桶 getchar get...
桶排序 基數排序 計數基數排序 Java
前面已經講述了很多排序演算法,但是他們的排序演算法都是基於兩個值之間的比較,通過決策樹的方法可以證明深度為d的二叉樹則最多有 一些好的排序演算法是可以達到時間複雜度是線性的,桶排序就是其中一種。比如有n個數,但是這些數的最大數不超過m。這個時候就可以定義乙個含有m個元素的陣列 初始值為0 然後遍歷n...