免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
排序算法 --- 計數(shù)排序

前面說的那些排序算法,都是要通過比較來實現(xiàn)的。排序還能不通過比較來實現(xiàn)?是的,計數(shù)排序就是這么神奇。

一、排序思想

創(chuàng)建一個計數(shù)數(shù)組,利用數(shù)組下標(biāo)來表示該元素,用數(shù)組下標(biāo)對應(yīng)的值來表示元素出現(xiàn)的次數(shù)。然后遍歷計數(shù)數(shù)組即可。比如下標(biāo)為5,元素值為2,表示5出現(xiàn)兩次,連續(xù)寫兩次5即可。

1. 案例:

假如待排序列arr如下:

5   7    4    8   3    5

最大元素是8,所以創(chuàng)建一個最大下標(biāo)為8的數(shù)組:

int[] count = new int[9];

遍歷待排序列,第一個是5,所以count[5]++,第二個是7,所以count[7]++…… 最終count數(shù)組就是:

0   0   0   1   1   2   0   1   1   // 元素值
0   1   2   3   4   5   6   7   8   // 下標(biāo)

最后根據(jù)count數(shù)組,可以知道,3出現(xiàn)一次,4出現(xiàn)一次,5出現(xiàn)兩次……就可以知道排序后應(yīng)該是這樣的:

3   4   5   5   7   8

這樣看似很完美,但是會存在兩個問題。

2. 問題一:

上面的5出現(xiàn)了兩次,最后排完序的的數(shù)組中下標(biāo)為2的那個5,還是原序列中下標(biāo)為0的那個5嗎?也就是說,當(dāng)值相同的情況下,無法保證排序后相同元素出現(xiàn)的順序和排序前一致,這也就是我們說的不穩(wěn)定排序。如何優(yōu)化呢?

我們給之前的數(shù)組中兩個5做上標(biāo)記,便于區(qū)分:

小紅                                      小白
5       7        4        8       3       5
  • 然后和之前一樣,統(tǒng)計每個元素出現(xiàn)的次數(shù),得到count數(shù)組:
0   0   0   1   1   2   0   1   1   // 元素值
0   1   2   3   4   5   6   7   8   // 下標(biāo)
  • 接下來,對count數(shù)組進行變形,讓后一個元素加上前一個元素,即:
count[i] = count[i] + count[i-1];

這樣一來,count數(shù)組就變成了:

0   0   0   1   2   4   4   5   6 // 元素值
0   1   2   3   4   5   6   7   8 // 下標(biāo)
  • 然后,創(chuàng)建一個新數(shù)組resultArr,長度和原數(shù)組arr一樣。從后往前遍歷原數(shù)組arr,第一個是5,標(biāo)記是小白,count[5]的值是4,表示小白排第四位,所以resultArr[4-1] = 5,同時count[5]--,即把4變成3,下一個5就表示排第三位,小紅就排第三,和原數(shù)組的順序一致。這樣一來,就將計數(shù)排序變成穩(wěn)定的了。

3. 問題二:

假如現(xiàn)有待排序列arr如下:

999   998   1000  995

按照之前的說法,count數(shù)組的最大下標(biāo)是arr數(shù)組最大值,即如果要排這四個數(shù),需要創(chuàng)建長度為1001的數(shù)組。而且,下標(biāo)0到994的這些空間都用不到,白白浪費了。所以,count數(shù)組的長度應(yīng)該是max(arr) - min(arr) + 1,即用最大值減去最小值再加1即可。此案例中,count的長度就是1000 - 995 + 1 = 6,那么每個元素應(yīng)該放在哪個下標(biāo)上呢?每個元素都減去最小元素,得出來的值就對應(yīng)count的下標(biāo)。比如999 - 995 = 4,那么999就應(yīng)該對應(yīng)count[4]

4. 計數(shù)排序的缺點:從上面的分析可以知道,計數(shù)排序適合分布比較集中的數(shù)據(jù),即最大值和最小值相差不多,如果相差特別多,就會很耗費空間。

二、代碼實現(xiàn)

public static void countSort(int[] arr) {
 if (arr == null || arr.length == 1) {
  return;
 }
 // 1. 找到數(shù)組中最大的數(shù)和最小的數(shù)
 int max = arr[0];
 int min = arr[0];
 for (int i=1; i<arr.length; i++) {
  max = arr[i] > max ? arr[i] : max;
  min = arr[i] < min ? arr[i] : min;
 }
 // 2. 定義count數(shù)組
 int[] count = new int[max - min + 1];
 // 3. 遍歷原數(shù)組,進行計數(shù)
 for (int i=0; i<arr.length; i++) {
  count[arr[i] - min]++;
 }
 // 4. 對count數(shù)組進行變形,讓計數(shù)排序變成穩(wěn)定的
 for (int i=1; i<count.length; i++) {
  count[i] += count[i-1];
 }
 // 5. 創(chuàng)建接收結(jié)果的數(shù)組
 int[] result = new int[arr.length];
 // 6. 倒序遍歷原數(shù)組,并且將結(jié)果存到result數(shù)組中
 for (int i=arr.length-1; i>=0; i--) {
  result[count[arr[i] - min] - 1] = arr[i];
  count[arr[i] - min] --;
 }
 // 7. 把result數(shù)組拷貝回原數(shù)組即可
 System.arraycopy(result, 0, arr, 0,  arr.length);
}

掃描二維碼

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
JavaSE| 數(shù)組
排序算法詳解(java代碼實現(xiàn))
一個數(shù)組中只有0,1,2三種元素,要求對這樣的數(shù)組進行排序
PHP數(shù)據(jù)結(jié)構(gòu)-順序表(數(shù)組)的相關(guān)邏輯操作
JavaScript數(shù)組 - 屬性/遍歷
LeetCode 769.最多能完成排序的塊(中等)
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服