chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

深入淺談?dòng)?jì)數(shù)排序

算法與數(shù)據(jù)結(jié)構(gòu) ? 來(lái)源:袁廚的算法小屋 ? 作者:廚子 ? 2021-04-28 16:20 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

計(jì)數(shù)排序雖然不是面試??碱}目,但是計(jì)數(shù)排序的求統(tǒng)計(jì)數(shù)組步驟和最后元素歸位思想是我們刷題時(shí)經(jīng)常用到的,例如原地置換,使用數(shù)組模擬 hashmap 等,所以還是很有必要看一下的。

今天我們就一起來(lái)看看線性排序里的計(jì)數(shù)排序到底是怎么回事吧。

我們將鏡頭切到袁記菜館

因?yàn)榻衲暝洸损^的效益不錯(cuò),所以袁廚就想給員工發(fā)些小福利,讓小二根據(jù)員工工齡進(jìn)行排序,但是菜館共有 100000 名員工,菜館開(kāi)業(yè) 10 年,員工工齡從 0 - 10 不等。

看來(lái)這真是一個(gè)艱巨的任務(wù)啊。

當(dāng)然我們可以借助之前說(shuō)過(guò)的 歸并排序 和 快速排序 解決,但是我們有沒(méi)有其他更好的方法呢?

了解排序算法的老哥可能已經(jīng)猜到今天寫(xiě)什么啦。是滴,我們今天來(lái)寫(xiě)寫(xiě)用空間換時(shí)間的線性排序。

說(shuō)之前我們先來(lái)回顧一下之前的排序算法,最好的時(shí)間復(fù)雜度為 O(nlogn) ,且都基于元素之間的比較來(lái)進(jìn)行排序。

我們來(lái)說(shuō)一下非基于元素比較的排序算法,且時(shí)間復(fù)雜度為 O(n),時(shí)間復(fù)雜度是線性的,所以我們稱(chēng)其為線性排序算法。

其優(yōu)勢(shì)在于在對(duì)一定范圍內(nèi)的整數(shù)排序時(shí),它的復(fù)雜度為Ο(n+k),此時(shí)的 k 則代表整數(shù)的范圍。快于任何一種比較類(lèi)排序算法,不過(guò)也是需要犧牲一些空間來(lái)?yè)Q取時(shí)間。

下面我們先來(lái)看看什么是計(jì)數(shù)排序,這個(gè)計(jì)數(shù)的含義是什么?

我們假設(shè)某一分店共有 10 名員工,

工齡分別為 1,2,3,5,0,2,2,4,5,9

那么我們將其存在一個(gè)長(zhǎng)度為 10 的數(shù)組里,,但是我們注意,我們數(shù)組此時(shí)存的并不是元素值,而是元素的個(gè)數(shù)。見(jiàn)下圖

09f15c56-a7f9-11eb-9728-12bb97331649.png

注:此時(shí)我們這里統(tǒng)計(jì)次數(shù)的數(shù)組長(zhǎng)度根據(jù)最大值來(lái)決定,上面的例子中最大值為 9 ,則長(zhǎng)度為 9 + 1 = 10。暫且先這樣理解,后面會(huì)對(duì)其優(yōu)化 。

我們繼續(xù)以上圖的例子來(lái)說(shuō)明,在該數(shù)組中,索引代表的為元素值(也就是上面例子中的工齡),數(shù)組的值代表的則是元素個(gè)數(shù)(也就是不同工齡出現(xiàn)的次數(shù))。

即工齡為 0 的員工有 1 個(gè), 工齡為 1 的員工有 1 個(gè),工齡為 2 的員工有 3 個(gè) 。。。

然后我們根據(jù)出現(xiàn)次數(shù)將其依次取出看看是什么效果。

0,1,2,2,2,3,4,5,5,9

我們發(fā)現(xiàn)此時(shí)元素則變成了有序的,但是這并不是排序,只是簡(jiǎn)單的按照統(tǒng)計(jì)數(shù)組的下標(biāo),輸出了元素值,并沒(méi)有真正的給原始數(shù)組進(jìn)行排序。

這樣操作之后我們不知道工齡屬于哪個(gè)員工。

見(jiàn)下圖

0a30bfea-a7f9-11eb-9728-12bb97331649.png

舉例

雖然喵哥和杰哥工齡相同,如果我們按照上面的操作輸出之后,我們不能知道工齡為 4 的兩個(gè)員工,哪個(gè)是喵哥哪個(gè)是杰哥。

所以我們需要借助其他方法來(lái)對(duì)元素進(jìn)行排序。

大家還記不記得我們之前說(shuō)過(guò)的前綴和,下面我們通過(guò)上面統(tǒng)計(jì)次數(shù)的數(shù)組求出其前綴和數(shù)組。

0a4cf3d6-a7f9-11eb-9728-12bb97331649.png

因?yàn)槲覀兪峭ㄟ^(guò)統(tǒng)計(jì)次數(shù)的數(shù)組得到了前綴和數(shù)組,那么我們來(lái)分析一下 presum 數(shù)組里面值的含義。

例如我們的 presum[2] = 5 ,代表的則是原數(shù)組小于等于 2 的值共有 5 個(gè)。presum[4] = 7 代表小于等于 4 的元素共有 7 個(gè)。

是不是感覺(jué)計(jì)數(shù)排序的含義要慢慢顯現(xiàn)出來(lái)啦。

其實(shí)到這里我們已經(jīng)可以理解的差不多了,還差最后一步,

此時(shí)我們要從后往前遍歷原始數(shù)組,然后將遍歷到的元素放到臨時(shí)數(shù)組的合適位置,并修改 presum 數(shù)組的值,遍歷結(jié)束后則達(dá)到了排序的目的。

這時(shí)有人要問(wèn)了,為什么我們要從后往前遍歷呢?

這個(gè)問(wèn)題的答案,我們等下說(shuō),繼續(xù)往下看吧。

0a583e94-a7f9-11eb-9728-12bb97331649.png

計(jì)數(shù)排序

我們從后往前遍歷,nums[9] = 9,則我們拿該值去 presum 數(shù)組中查找,發(fā)現(xiàn) presum[nums[9]] = presum[9] = 10 ,

大家還記得我們 presum 數(shù)組里面每個(gè)值的含義嗎,我們此時(shí) presum[9] = 10,則代表在數(shù)組中,小于等于的數(shù)共有 10 個(gè),則我們要將他排在臨時(shí)數(shù)組的第 10 個(gè)位置,也就是 temp[9] = 9。

我們還需要干什么呢?我們想一下,我們已經(jīng)把 9 放入到 temp 數(shù)組里了,已經(jīng)對(duì)其排好序了,那么我們的 presum 數(shù)組則不應(yīng)該再統(tǒng)計(jì)他了,則將相應(yīng)的位置減 1 即可,也就是 presum[9] = 10 - 1 = 9;

0a79d392-a7f9-11eb-9728-12bb97331649.png

下面我們繼續(xù)遍歷 5 ,然后同樣執(zhí)行上訴步驟

0aa1f8f4-a7f9-11eb-9728-12bb97331649.png

我們繼續(xù)查詢 presum 數(shù)組,發(fā)現(xiàn) presum[5] = 9,則說(shuō)明小于等于 5 的數(shù)共有 9 個(gè),我們將其放入到 temp 數(shù)組的第 9 個(gè)位置,也就是

temp[8] = 5。然后再將 presum[5] 減 1 。

0aba5ae8-a7f9-11eb-9728-12bb97331649.png

是不是到這里就理解了計(jì)數(shù)排序的大致思路啦。

那么我們?yōu)槭裁葱枰獜暮笸氨闅v呢?我們思考一下,如果我們從前往后遍歷,相同元素的話,前面的元素則會(huì)先歸位再減一,這樣則會(huì)使計(jì)數(shù)排序變成不穩(wěn)定的排序算法。

這個(gè)排序的過(guò)程像不像查字典呢?通過(guò)查詢 presum 數(shù)組,得出自己應(yīng)該排在臨時(shí)數(shù)組的第幾位。然后再修改下字典,直到遍歷結(jié)束。

那么我們先來(lái)用動(dòng)畫(huà)模擬一下我們這個(gè) bug 版的計(jì)數(shù)排序,加深理解。

注:我們得到 presum 數(shù)組的過(guò)程在動(dòng)畫(huà)中省略。直接模擬排序過(guò)程。

計(jì)數(shù)排序

但是到現(xiàn)在就完了嗎?顯然沒(méi)有,我們思考下這個(gè)情況。

假如我們的數(shù)字為 90,93,94,91,92 如果我們根據(jù)上面方法設(shè)置 presum 數(shù)組的長(zhǎng)度,那我們則需要設(shè)置數(shù)組長(zhǎng)度為 95(因?yàn)樽畲笾凳?4),這樣顯然是不合理的,會(huì)浪費(fèi)掉很多空間。

還有就是當(dāng)我們需要對(duì)負(fù)數(shù)進(jìn)行排序時(shí)同樣會(huì)出現(xiàn)問(wèn)題,因?yàn)槲覀兦蟠螖?shù)的時(shí)候是根據(jù) nums[index] 的值來(lái)填充 presum 數(shù)組的,所以當(dāng) nums[index] 為負(fù)數(shù)時(shí),填充 presum 數(shù)組時(shí)則會(huì)報(bào)錯(cuò)。

此時(shí)通過(guò)最大值來(lái)定義數(shù)組長(zhǎng)度也不合理。

所以我們需要采取別的方法來(lái)定義數(shù)組長(zhǎng)度。

下面我們來(lái)說(shuō)一下偏移量的概念。

例如 90,93,94,91,92,我們 可以通過(guò) max ,min 的值來(lái)設(shè)置數(shù)組長(zhǎng)度即 94 - 90 + 1 = 5 。偏移量則為 min 值,也就是 90。那么我們的 90 則對(duì)應(yīng)索引 0 。

見(jiàn)下圖。

0afe7e08-a7f9-11eb-9728-12bb97331649.png

這樣我們填充 presum 數(shù)組時(shí)就不會(huì)出現(xiàn)浪費(fèi)空間的情況了,負(fù)數(shù)?出現(xiàn)負(fù)數(shù)的情況當(dāng)然也可以。繼續(xù)看

例如:-1,-3,0,2,1

0b08c994-a7f9-11eb-9728-12bb97331649.png

一樣可以,哦了,到這里我們就搞定了計(jì)數(shù)排序,下面我們來(lái)看一哈代碼吧。

class Solution {

public int[] sortArray(int[] nums) {

int len = nums.length;

if (nums.length 《 1) {

return nums;

}

//求出最大最小值

int max = nums[0];

int min = nums[0];

for (int x : nums) {

if (max 《 x) max = x;

if (min 》 x) min = x;

}

//設(shè)置 presum 數(shù)組長(zhǎng)度,然后求出我們的前綴和數(shù)組,

//這里我們可以把求次數(shù)數(shù)組和前綴和數(shù)組用一個(gè)數(shù)組處理

int[] presum = new int[max-min+1];

for (int x : nums) {

presum[x-min]++;

}

for (int i = 1; i 《 presum.length; ++i) {

presum[i] = presum[i-1]+presum[i];

}

//臨時(shí)數(shù)組

int[] temp = new int[len];

//遍歷數(shù)組,開(kāi)始排序,注意偏移量

for (int i = len-1; i 》= 0; --i) {

//查找 presum 字典,然后將其放到臨時(shí)數(shù)組,注意偏移度

int index = presum[nums[i]-min]-1;

temp[index] = nums[i];

//相應(yīng)位置減一

presum[nums[i]-min]--;

}

//copy回原數(shù)組

System.arraycopy(temp,0,nums,0,len);

return nums;

}

}

好啦,這個(gè)排序算法我們已經(jīng)搞定了,下面我們來(lái)扒一扒它。

計(jì)數(shù)排序時(shí)間復(fù)雜度分析

我們的總體運(yùn)算量為 n+n+k+n ,總體運(yùn)算是 3n + k 所以時(shí)間復(fù)雜度為 O(N+K);

計(jì)數(shù)排序空間復(fù)雜度分析

我們用到了輔助數(shù)組,空間復(fù)雜度為 O(n)

計(jì)數(shù)排序穩(wěn)定性分析

穩(wěn)定性在我們最后存入臨時(shí)數(shù)組時(shí)有體現(xiàn),我們當(dāng)時(shí)讓其放入臨時(shí)數(shù)組的合適位置,并減一,所以某元素前面的相同元素,在臨時(shí)數(shù)組,仍然在其前面。所以計(jì)數(shù)排序是穩(wěn)定的排序算法。

雖然計(jì)數(shù)排序效率不錯(cuò)但是用到的并不多。

這是因?yàn)槠洚?dāng)數(shù)組元素的范圍太大時(shí),并不適合計(jì)數(shù)排序,不僅浪費(fèi)時(shí)間,效率還會(huì)大大降低。

當(dāng)待排序的元素非整數(shù)時(shí),也不適用,大家思考一下這是為什么呢?好啦,今天的文章就到這啦,我們下期再見(jiàn),拜了個(gè)拜

巨人的肩膀

算法導(dǎo)論

極客時(shí)間數(shù)據(jù)結(jié)構(gòu)與算法之美
編輯:lyn

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 計(jì)數(shù)
    +關(guān)注

    關(guān)注

    1

    文章

    57

    瀏覽量

    20377
  • 排序
    +關(guān)注

    關(guān)注

    0

    文章

    32

    瀏覽量

    9858
  • 排序算法
    +關(guān)注

    關(guān)注

    0

    文章

    53

    瀏覽量

    10249

原文標(biāo)題:計(jì)數(shù)排序真的不重要?

文章出處:【微信號(hào):TheAlgorithm,微信公眾號(hào):算法與數(shù)據(jù)結(jié)構(gòu)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    九進(jìn)制計(jì)數(shù)電路仿真設(shè)計(jì)

    九進(jìn)制計(jì)數(shù)電路仿真
    發(fā)表于 06-09 14:48 ?0次下載

    低成本電源排序器解決方案

    絕大多數(shù)負(fù)載點(diǎn)DC-DC轉(zhuǎn)換器可以將上一個(gè)轉(zhuǎn)換器的電源就緒輸出連接至下一個(gè)轉(zhuǎn)換器的使能輸入,實(shí)現(xiàn)上電排序。這種方法只適合比較簡(jiǎn)單的設(shè)計(jì),不能滿足多數(shù)現(xiàn)代微處理器和DSP的要求一這類(lèi)器件要求斷電順序必須與上電順序相反。許多廠商針對(duì)這類(lèi)應(yīng)用推出了可編程排序IC,但器件價(jià)格較為
    的頭像 發(fā)表于 05-21 09:55 ?546次閱讀
    低成本電源<b class='flag-5'>排序</b>器解決方案

    淺談直流有刷電機(jī)驅(qū)動(dòng)及調(diào)速技術(shù)

    ,圖1 為 H 橋電機(jī)驅(qū)動(dòng) 電路示意圖 : 圖1 H橋電機(jī)驅(qū)動(dòng)電路示意圖 點(diǎn)擊下方附件查看全文*附件:20250307_淺談直流有刷電機(jī)驅(qū)動(dòng)及調(diào)速技術(shù).docx
    發(fā)表于 03-07 15:24

    攻克反光難題,整箱礦泉水高速精準(zhǔn)計(jì)數(shù)

    在工業(yè)生產(chǎn)中,一次性進(jìn)行大量計(jì)數(shù)的應(yīng)用場(chǎng)景非常廣泛。比如制藥生產(chǎn)的藥粒計(jì)數(shù)、食品加工、電子制造行業(yè)微小電子計(jì)數(shù)。這些場(chǎng)景不僅要求計(jì)數(shù)工具具備高精度和高速度,還要求能夠應(yīng)對(duì)各種復(fù)雜環(huán)境和
    的頭像 發(fā)表于 01-14 07:34 ?426次閱讀
    攻克反光難題,整箱礦泉水高速精準(zhǔn)<b class='flag-5'>計(jì)數(shù)</b>

    詳解Linux sort命令之掌握排序技巧與實(shí)用案例

    排序,與-g區(qū)別為不轉(zhuǎn)為浮點(diǎn)數(shù) -g –general-number-sort 按通用數(shù)值排序,支持科學(xué)計(jì)數(shù)法 -f –ignore-case 忽略大小寫(xiě),默認(rèn)大小寫(xiě)字母不同 -k –key=POS1
    的頭像 發(fā)表于 01-09 10:10 ?937次閱讀

    TimSort:一個(gè)在標(biāo)準(zhǔn)函數(shù)庫(kù)中廣泛使用的排序算法

    在計(jì)算機(jī)科學(xué)的領(lǐng)域,排序算法是每位學(xué)生必學(xué)的基礎(chǔ),而排序的需求是每位程序員在編程過(guò)程中都會(huì)遇到的。 在你輕松調(diào)用 .sort() 方法對(duì)數(shù)據(jù)進(jìn)行排序時(shí),是否曾好奇過(guò),這個(gè)簡(jiǎn)單的方法背后使用的是哪種
    的頭像 發(fā)表于 01-03 11:42 ?584次閱讀

    雷擊計(jì)數(shù)器的概述與應(yīng)用分析

    雷擊計(jì)數(shù)器 是一種用于監(jiān)測(cè)和記錄電力系統(tǒng)、通信系統(tǒng)、建筑物等關(guān)鍵設(shè)施遭受雷擊次數(shù)的設(shè)備。它能夠有效地幫助管理人員掌握雷電活動(dòng)的情況,以便進(jìn)行預(yù)防性維護(hù)和風(fēng)險(xiǎn)評(píng)估。雷擊計(jì)數(shù)器根據(jù)工作原理可以分為無(wú)源
    的頭像 發(fā)表于 10-21 10:31 ?812次閱讀
    雷擊<b class='flag-5'>計(jì)數(shù)</b>器的概述與應(yīng)用分析

    時(shí)間復(fù)雜度為 O(n^2) 的排序算法

    作者:京東保險(xiǎn) 王奕龍 對(duì)于小規(guī)模數(shù)據(jù),我們可以選用時(shí)間復(fù)雜度為 O(n2) 的排序算法。因?yàn)闀r(shí)間復(fù)雜度并不代表實(shí)際代碼的執(zhí)行時(shí)間,它省去了低階、系數(shù)和常數(shù),僅代表的增長(zhǎng)趨勢(shì),所以在小規(guī)模數(shù)據(jù)情況下
    的頭像 發(fā)表于 10-19 16:31 ?1742次閱讀
    時(shí)間復(fù)雜度為 O(n^2) 的<b class='flag-5'>排序</b>算法

    74ls163是幾進(jìn)制同步計(jì)數(shù)

    74LS163 是一個(gè)十進(jìn)制同步計(jì)數(shù)器,它是一個(gè)集成電路(IC),用于數(shù)字電路中進(jìn)行計(jì)數(shù)操作。它是一個(gè)4位二進(jìn)制計(jì)數(shù)器,但由于其設(shè)計(jì),它可以很容易地被配置為一個(gè)十進(jìn)制計(jì)數(shù)器。這意味著它
    的頭像 發(fā)表于 10-18 13:54 ?2994次閱讀

    淺談基于物聯(lián)網(wǎng)的智能路燈系統(tǒng)-盾華電子智慧路燈解決方案

    淺談基于物聯(lián)網(wǎng)的智能路燈系統(tǒng)-盾華電子智慧路燈解決方案
    的頭像 發(fā)表于 10-11 10:08 ?900次閱讀
    <b class='flag-5'>淺談</b>基于物聯(lián)網(wǎng)的智能路燈系統(tǒng)-盾華電子智慧路燈解決方案

    TPS54120排序和跟蹤

    電子發(fā)燒友網(wǎng)站提供《TPS54120排序和跟蹤.pdf》資料免費(fèi)下載
    發(fā)表于 10-10 10:54 ?0次下載
    TPS54120<b class='flag-5'>排序</b>和跟蹤

    正交解碼計(jì)數(shù)器卡

    正交解碼計(jì)數(shù)器卡
    發(fā)表于 09-06 11:41 ?0次下載

    計(jì)數(shù)器的特點(diǎn)和參數(shù)

    計(jì)數(shù)器作為一種常用的電子元件,在電子設(shè)備和系統(tǒng)中扮演著至關(guān)重要的角色。它們不僅用于存儲(chǔ)和增減數(shù)字值,還廣泛應(yīng)用于時(shí)序和頻率測(cè)量、事件計(jì)數(shù)、控制步進(jìn)電機(jī)和伺服系統(tǒng)、錯(cuò)誤檢測(cè)和糾正以及計(jì)算機(jī)數(shù)據(jù)存儲(chǔ)和操作等領(lǐng)域。以下將詳細(xì)闡述計(jì)數(shù)
    的頭像 發(fā)表于 08-29 14:54 ?3190次閱讀

    計(jì)數(shù)傳感器是開(kāi)關(guān)量還是模擬量

    計(jì)數(shù)傳感器是一種用于檢測(cè)和計(jì)數(shù)物體數(shù)量的傳感器,它可以將物體的數(shù)量轉(zhuǎn)換為電信號(hào)輸出。計(jì)數(shù)傳感器在工業(yè)自動(dòng)化、物流、包裝、醫(yī)療等領(lǐng)域有著廣泛的應(yīng)用。計(jì)數(shù)傳感器按照其輸出信號(hào)的類(lèi)型可以分為
    的頭像 發(fā)表于 07-25 09:50 ?1030次閱讀

    計(jì)數(shù)器同步和異步怎么判斷

    計(jì)數(shù)器同步和異步是數(shù)字電路設(shè)計(jì)中的一個(gè)重要概念,它們?cè)诤芏鄳?yīng)用場(chǎng)景中都扮演著關(guān)鍵角色。 一、計(jì)數(shù)器概述 計(jì)數(shù)器是一種常見(jiàn)的數(shù)字電路,它可以對(duì)輸入信號(hào)進(jìn)行計(jì)數(shù),并將
    的頭像 發(fā)表于 07-23 11:14 ?2686次閱讀