18video性欧美19sex,欧美高清videosddfsexhd,性少妇videosexfreexxx片中国,激情五月激情综合五月看花,亚洲人成网77777色在线播放

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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

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

深入淺談計數(shù)排序

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

掃碼添加小助手

加入工程師交流群

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

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

我們將鏡頭切到袁記菜館

因為今年袁記菜館的效益不錯,所以袁廚就想給員工發(fā)些小福利,讓小二根據(jù)員工工齡進行排序,但是菜館共有 100000 名員工,菜館開業(yè) 10 年,員工工齡從 0 - 10 不等。

看來這真是一個艱巨的任務啊。

當然我們可以借助之前說過的 歸并排序 和 快速排序 解決,但是我們有沒有其他更好的方法呢?

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

說之前我們先來回顧一下之前的排序算法,最好的時間復雜度為 O(nlogn) ,且都基于元素之間的比較來進行排序。

我們來說一下非基于元素比較的排序算法,且時間復雜度為 O(n),時間復雜度是線性的,所以我們稱其為線性排序算法。

其優(yōu)勢在于在對一定范圍內(nèi)的整數(shù)排序時,它的復雜度為Ο(n+k),此時的 k 則代表整數(shù)的范圍??煊谌魏我环N比較類排序算法,不過也是需要犧牲一些空間來換取時間。

下面我們先來看看什么是計數(shù)排序,這個計數(shù)的含義是什么?

我們假設某一分店共有 10 名員工,

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

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

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

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

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

即工齡為 0 的員工有 1 個, 工齡為 1 的員工有 1 個,工齡為 2 的員工有 3 個 。。。

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

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

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

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

見下圖

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

舉例

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

所以我們需要借助其他方法來對元素進行排序。

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

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

因為我們是通過統(tǒng)計次數(shù)的數(shù)組得到了前綴和數(shù)組,那么我們來分析一下 presum 數(shù)組里面值的含義。

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

是不是感覺計數(shù)排序的含義要慢慢顯現(xiàn)出來啦。

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

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

這時有人要問了,為什么我們要從后往前遍歷呢?

這個問題的答案,我們等下說,繼續(xù)往下看吧。

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

計數(shù)排序

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

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

我們還需要干什么呢?我們想一下,我們已經(jīng)把 9 放入到 temp 數(shù)組里了,已經(jīng)對其排好序了,那么我們的 presum 數(shù)組則不應該再統(tǒ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,則說明小于等于 5 的數(shù)共有 9 個,我們將其放入到 temp 數(shù)組的第 9 個位置,也就是

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

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

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

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

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

那么我們先來用動畫模擬一下我們這個 bug 版的計數(shù)排序,加深理解。

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

計數(shù)排序

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

假如我們的數(shù)字為 90,93,94,91,92 如果我們根據(jù)上面方法設置 presum 數(shù)組的長度,那我們則需要設置數(shù)組長度為 95(因為最大值是94),這樣顯然是不合理的,會浪費掉很多空間。

還有就是當我們需要對負數(shù)進行排序時同樣會出現(xiàn)問題,因為我們求次數(shù)的時候是根據(jù) nums[index] 的值來填充 presum 數(shù)組的,所以當 nums[index] 為負數(shù)時,填充 presum 數(shù)組時則會報錯。

此時通過最大值來定義數(shù)組長度也不合理。

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

下面我們來說一下偏移量的概念。

例如 90,93,94,91,92,我們 可以通過 max ,min 的值來設置數(shù)組長度即 94 - 90 + 1 = 5 。偏移量則為 min 值,也就是 90。那么我們的 90 則對應索引 0 。

見下圖。

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

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

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

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

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

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;

}

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

//這里我們可以把求次數(shù)數(shù)組和前綴和數(shù)組用一個數(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ù)組

int[] temp = new int[len];

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

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

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

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

temp[index] = nums[i];

//相應位置減一

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

}

//copy回原數(shù)組

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

return nums;

}

}

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

計數(shù)排序時間復雜度分析

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

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

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

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

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

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

這是因為其當數(shù)組元素的范圍太大時,并不適合計數(shù)排序,不僅浪費時間,效率還會大大降低。

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

巨人的肩膀

算法導論

極客時間數(shù)據(jù)結構與算法之美
編輯:lyn

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

    關注

    1

    文章

    58

    瀏覽量

    20531
  • 排序
    +關注

    關注

    0

    文章

    32

    瀏覽量

    9928
  • 排序算法
    +關注

    關注

    0

    文章

    53

    瀏覽量

    10336

原文標題:計數(shù)排序真的不重要?

文章出處:【微信號:TheAlgorithm,微信公眾號:算法與數(shù)據(jù)結構】歡迎添加關注!文章轉(zhuǎn)載請注明出處。

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    深入解析與使用感受:Isograph、Medini與REANA可靠性分析軟件對比

    上海磐時PANSHI“磐時,做汽車企業(yè)的安全智庫”深入解析與使用感受:Isograph、Medini與REANA可靠性分析軟件對比汽車行業(yè)的復雜性和對安全性的高要求,使得傳統(tǒng)的分析工具往往需要耗費
    的頭像 發(fā)表于 09-05 16:20 ?10次閱讀
    <b class='flag-5'>深入</b>解析與使用感受:Isograph、Medini與REANA可靠性分析軟件對比

    國際首創(chuàng)新突破!中國團隊以存算一體排序架構攻克智能硬件加速難題

    2025 年 6 月 25 日,北京大學團隊在智能計算硬件方面取得領先突破,國際上首次實現(xiàn)了基于存算一體技術的高效排序硬件架構 (A fast and reconfigurable
    的頭像 發(fā)表于 07-02 16:50 ?426次閱讀
    國際首創(chuàng)新突破!中國團隊以存算一體<b class='flag-5'>排序</b>架構攻克智能硬件加速難題

    九進制計數(shù)電路仿真設計

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

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

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

    STM32U083進行外部計數(shù)只能計數(shù)8000多一點,為什么?

    背景: 使用LPTIME1進行計數(shù)。 LPTIMER配置如下: 時鐘配置如下: 使用過LSE;PCLK配置,計數(shù)還是一樣的 實際計數(shù)只能計數(shù)到8000多;使用信號發(fā)生器產(chǎn)生9KHz
    發(fā)表于 03-12 06:21

    淺談直流有刷電機驅(qū)動及調(diào)速技術

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

    【RA-Eco-RA2L1-48PIN-V1.0開發(fā)板試用】——PWM

    定時器,共有6個通道(GPT16,編號4-9) 3、支持三種計數(shù)模式(上計數(shù)模式、下計數(shù)模式、上下計數(shù)模式) 4、每個通道都可以獨立選擇時鐘源 5、每個通道都有兩個輸入\\\\輸出引腳
    發(fā)表于 01-26 15:40

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

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

    UC-018:時間間隔計數(shù)器的用途

    電子發(fā)燒友網(wǎng)站提供《UC-018:時間間隔計數(shù)器的用途.pdf》資料免費下載
    發(fā)表于 01-13 17:02 ?0次下載
    UC-018:時間間隔<b class='flag-5'>計數(shù)</b>器的用途

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

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

    TimSort:一個在標準函數(shù)庫中廣泛使用的排序算法

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

    霍爾開關的應用有哪些?矽睿半導體霍爾開關在產(chǎn)品計數(shù)的智能應用

    霍爾開關在產(chǎn)品計數(shù)中的智能應用主要體現(xiàn)在提高計數(shù)精度和效率方面。霍爾開關是一種感應元件,可以感知磁場的變化,并將其轉(zhuǎn)化為電信號進行處理。這種特性使其在產(chǎn)品計數(shù)系統(tǒng)中具有廣泛的應用。 霍爾開關
    的頭像 發(fā)表于 12-20 16:48 ?697次閱讀

    智能雷擊計數(shù)器的綜合行業(yè)解決方案

    智能雷擊計數(shù)器 是一種用于記錄雷擊事件發(fā)生次數(shù)的高科技裝置,廣泛應用于防雷系統(tǒng)中。與傳統(tǒng)的機械式雷擊計數(shù)器相比,智能雷擊計數(shù)器不僅能夠精確記錄雷擊次數(shù),還能對雷電參數(shù)進行分析,并通過智能通信模塊實現(xiàn)
    的頭像 發(fā)表于 12-20 10:50 ?706次閱讀
    智能雷擊<b class='flag-5'>計數(shù)</b>器的綜合行業(yè)解決方案

    技術資訊 I 設計數(shù)據(jù)管理要點

    本文要點什么是設計數(shù)據(jù)管理?為什么說管理設計數(shù)據(jù)非常重要?有效的設計數(shù)據(jù)管理要注意哪些事項?PCBA開發(fā)和/或生產(chǎn)的各個方面都取決于設計數(shù)據(jù)的清晰度和準確性。這些數(shù)據(jù)包括原理圖捕獲
    的頭像 發(fā)表于 11-09 01:05 ?621次閱讀
    技術資訊 I 設<b class='flag-5'>計數(shù)</b>據(jù)管理要點

    獲取通信事件計數(shù)器與獲取通信事件記錄

    11功能碼主要用于獲取從設備通信計數(shù)器中的狀態(tài)字和事件計數(shù)的值,本功能碼不支持廣播模式。通過在通信報文之前和之后讀取通信事件計數(shù)值,可以確定從設備是否正常處理報文。
    的頭像 發(fā)表于 11-05 15:16 ?2981次閱讀