演算法之計數排序

2021-09-28 10:36:12 字數 2083 閱讀 6642

原理:用乙個陣列記錄待排序陣列**現的數字。

最低位代表最小值,偏移量是記錄陣列中的下標;

待排序陣列: 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 是輸出的有序陣列,再將有序的...