原理:用乙個陣列記錄待排序陣列**現的數字。
最低位代表最小值,偏移量是記錄陣列中的下標;
待排序陣列: 2 1 4 可以表示為
記錄陣列: 1 1 0 1 陣列長度為(4-1+1)
然後根據記錄陣列輸出結果
public
static
void
countsort
(int
arr)
if(arr.length<=1)
int maxvalue=
getmax
(arr)
;int minvalue=
getmin
(arr)
;// 建立乙個陣列來記錄出現的數字
int[
] recordarr=
newint
[maxvalue-minvalue+1]
;// 看一下哪個數字出現了
for(
int i=
0;i)// 輸出出現在待排序陣列**現的數字
int curarrindex=0;
int len=arr.length;
int currecordindex=0;
while
(curarrindexelse}}
// 獲取陣列中的最大值
public
static
intgetmax
(int
arr)
}return res;
}// 獲取陣列中的最小只
public
static
intgetmin
(int
arr)
}return res;
}
但上面這種方法,本質上並未對待排序陣列進行排序(操作),如果排序的是物件的話,就無法使用,而且也不能解決穩定性問題
解決方法:
在獲得記錄陣列後,更新記錄陣列,每一位+=前一位,這樣一來,記錄陣列的值-1代表 所記錄數字在排序結果中的下標
待排序陣列:1 4 2
記錄陣列:1 1 0 1
更新後: 1 2 2 3
從後面讀起:
待排序陣列中,2對應位置為下標2-1;4對應下標為3-1;1對應下表為1-1
//進化版計數排序
// 由於初級版本通過記錄出現的數字,然後直接輸出獲得陣列,並沒有實際操作待排序陣列
// 這種排序只能對物件進行排序,並且是不穩定的
public
static
void
countsort
(int
arr)
int maxvalue=
getmax
(arr)
;int minvalue=
getmin
(arr)
;// 建立乙個陣列來記錄出現的數字
int[
] recordarr=
newint
[maxvalue-minvalue+1]
;// 看一下哪個數字出現了
for(
int i=
0;i)// 更新記錄陣列
for(
int i=
1;i)int
res=
newint
[arr.length]
;for
(int i=arr.length-
1;i>=
0;i--
) arr=res;
}// 獲取陣列中的最大值
public
static
intgetmax
(int
arr)
}return res;
}// 獲取陣列中的最小只
public
static
intgetmin
(int
arr)
}return res;
}
演算法之計數排序
核心思想 通過計算某個資料之前有多少個資料來確定自身的位置,不通過資料之間的相互比較,所以是非比較排序。原始計數排序 時間複雜度 o n k k為資料量 缺點 如果資料只有兩個,9999,10000,那麼會額外建立容量為10000的陣列,浪費空間。public static int countsor...
排序演算法之計數排序
今在學習中,遇到計數排序演算法,雖然其對待排序的序列要求嚴格,但對於符合條件的序列來說,其時間複雜度很小。故列於此,僅為學習記憶。參考資料 對於僅由大寫字母 或小寫字母 構成的無序序列,可採用下面演算法進行排序。該演算法不在序列的每個元素間進行比較,而是使用了乙個額外的help整型字串來記錄每個元素...
演算法 排序之計數排序
最近想到演算法導論中的計數排序,看看理解的怎麼樣試著講講自己的理解。1 思想 計數排序 是 線性時間的 排序演算法,時間複雜度為o n 雖然有一定的侷限性。但是還是很好的一種演算法。用2個陣列進行額外的儲存資訊,陣列 c 是對 資料中值相同的 記錄下來,以便後面查閱 b 是輸出的有序陣列,再將有序的...