計(jì)數(shù)排序铜秆、基數(shù)排序

目錄

1淹真、前言
2、計(jì)數(shù)排序
3连茧、基數(shù)排序
4核蘸、使用場(chǎng)景

1巍糯、前言

常見(jiàn)的排序算法有很多,例如歸并排序客扎、堆排序祟峦、快速排序還有插入排序等等该面,以上排序有一個(gè)共同點(diǎn)妓蛮,隊(duì)列中的元素需要通過(guò)比較來(lái)計(jì)算元素的位置,它們被統(tǒng)稱為比較排序窗声。

比較排序是有效率極值存在的袱吆。比較排序過(guò)程可以被抽象為決策樹模型厌衙,決策樹模型是一個(gè)二叉樹。每個(gè)元素的位置根據(jù)二叉樹最終決定自己的位置绞绒。


image.png

在最壞情況下婶希,任何比較排序算法至少需要做N*lgN次比較

此定理的詳細(xì)推導(dǎo)過(guò)程請(qǐng)參照算法導(dǎo)論。

比較排序算法是有效率極值存在的处铛。本文中介紹的兩種算法非比較排序算法饲趋,它們都需要滿足一定的條件,它們的效率值均為N撤蟆。

1奕塑、計(jì)數(shù)排序

如果一個(gè)數(shù)組中的最大值已知,且數(shù)組中最大值減去最小值的差不大的話家肯,則可以使用計(jì)數(shù)排序龄砰。計(jì)數(shù)排序,顧名思義讨衣,統(tǒng)計(jì)數(shù)組中每個(gè)元素出現(xiàn)的次數(shù)换棚,然后計(jì)算出小于或等于p的元素個(gè)數(shù)q,那么p在數(shù)組中的位置應(yīng)該是q-1(數(shù)組從0開(kāi)始反镇,所以要減1)固蚤。

計(jì)數(shù)排序需要使用額外的內(nèi)存空間,一個(gè)待排序數(shù)組的等長(zhǎng)數(shù)組歹茶,一個(gè)計(jì)數(shù)數(shù)組夕玩。

/**
 * @param arrayA 待排序數(shù)組
 * @param arrayB 返回的正確排序的數(shù)組
 * @param k 數(shù)組A中的元素最大值
 */
public static int[] countSort(int[] arrayA, int[] arrayB, int k){
    int value = 0;
    int pos = 0;
    
    int size = arrayA.length;
    int[] arrayC = new int[k + 1];
    for (int i = 0; i <= k; i++) {
        arrayC[i] = 0;
    }
    //數(shù)組a中每一個(gè)value出現(xiàn)的個(gè)數(shù),存儲(chǔ)在c中惊豺,因?yàn)閏中長(zhǎng)度為k+1
    //而a中元素最大值為k燎孟,所以可以存下這些值
    for (int i = 0; i < size; i++) {
        arrayC[arrayA[i]]++;
    }
    //數(shù)組C[i]中存放的是a中i元素出現(xiàn)的個(gè)數(shù),所以C[i]+C[i-1],則是不大于i的元素的個(gè)數(shù)
    for (int i = 1; i <= k; i++) {
        arrayC[i] = arrayC[i] + arrayC[i-1];
    }
    //從數(shù)組c中取出a數(shù)組中元素不大于自己的個(gè)數(shù)尸昧,然后放入新數(shù)組b中揩页,則排序已完成
    for (int i = size-1; i >= 0; i--) {
        value = arrayA[i];
        pos = arrayC[value];
        arrayB[pos-1]=value;
        arrayC[value]--;
    }
    return arrayB;
}

2、基數(shù)排序

計(jì)數(shù)排序的使用條件有點(diǎn)尷尬烹俗,必須找到數(shù)組中的最大值爆侣,找最大值至少也要lgN的時(shí)間萍程。基數(shù)排序累提,可理解為對(duì)計(jì)數(shù)排序的完美使用方式尘喝。

基數(shù)排序,將數(shù)組中的元素按照個(gè)十百千位分門別類斋陪,分別先后對(duì)個(gè)們朽褪、十位、百位无虚、千位等排序缔赠,那么最后結(jié)果肯定也是有序的。假如針對(duì)所有元素的個(gè)位排序友题,由于個(gè)位上的最大值為9嗤堰,非常符合計(jì)數(shù)排序的條件。由此度宦,基數(shù)排序的算法就是踢匣,針對(duì)個(gè)、十戈抄、百等位置上使用計(jì)數(shù)排序离唬。

public static int[] countSort2(int[] arrayA, int index){
    int value = 0;
    int pos = 0;
    //個(gè)、十划鸽、百等位置上最大值為9
    int k = 9;
    
    int size = arrayA.length;
    int[] arrayB = new int[size];
    int[] arrayC = new int[k + 1];
    
    for (int i = 0; i <= k; i++) {
        arrayC[i] = 0;
    }
    //數(shù)組c中存的是數(shù)組a某個(gè)具體數(shù)位上的值的出現(xiàn)次數(shù)
    for (int i = 0; i < size; i++) {
        arrayC[getBitData(arrayA[i], index)]++;
    }
    for (int i = 1; i <= k; i++) {
        arrayC[i] = arrayC[i] + arrayC[i-1];
    }
    //注意b中存放的是數(shù)組a中的值输莺。
    for (int i = size-1; i >= 0; i--) {
        value = getBitData(arrayA[i], index);
        pos = arrayC[value];
        arrayB[pos-1]=arrayA[i];
        arrayC[value]--;
    }
    return arrayB;
}
  public static int[] radixSort(int[] arrayA,int index){
    for (int i = 0; i < index; i++) {
        arrayA = countSort2(arrayA, i);
    }
    return arrayA;
}

基數(shù)排序,非常適合比較時(shí)間大小等裸诽,以后遇到時(shí)間的排序應(yīng)該第一時(shí)間想到基數(shù)排序嫂用。

本文中代碼已上傳到本人的github空間,歡迎訪問(wèn)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末丈冬,一起剝皮案震驚了整個(gè)濱河市嘱函,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌埂蕊,老刑警劉巖实夹,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異粒梦,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)荸实,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門匀们,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人准给,你說(shuō)我怎么就攤上這事泄朴≈囟叮” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵祖灰,是天一觀的道長(zhǎng)钟沛。 經(jīng)常有香客問(wèn)我,道長(zhǎng)局扶,這世上最難降的妖魔是什么恨统? 我笑而不...
    開(kāi)封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮三妈,結(jié)果婚禮上畜埋,老公的妹妹穿的比我還像新娘。我一直安慰自己畴蒲,他們只是感情好悠鞍,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著模燥,像睡著了一般咖祭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蔫骂,一...
    開(kāi)封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天么翰,我揣著相機(jī)與錄音,去河邊找鬼纠吴。 笑死硬鞍,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的戴已。 我是一名探鬼主播固该,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼糖儡!你這毒婦竟也來(lái)了伐坏?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤握联,失蹤者是張志新(化名)和其女友劉穎桦沉,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體金闽,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡纯露,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了代芜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片埠褪。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出钞速,到底是詐尸還是另有隱情贷掖,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布渴语,位于F島的核電站苹威,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏驾凶。R本人自食惡果不足惜牙甫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望狭郑。 院中可真熱鬧腹暖,春花似錦、人聲如沸翰萨。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)亩鬼。三九已至殖告,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間雳锋,已是汗流浹背黄绩。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留玷过,地道東北人爽丹。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像辛蚊,于是被迫代替她去往敵國(guó)和親粤蝎。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容