国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

計數(shù)排序真的不重要?

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

[[393168]]

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

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

我們將鏡頭切到袁記菜館

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

看來這真是一個艱巨的任務(wù)啊。

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

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

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

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

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

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

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

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

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

注:此時我們這里統(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ù)組的下標(biāo),輸出了元素值,并沒有真正的給原始數(shù)組進(jìn)行排序。

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

見下圖

舉例

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

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

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

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

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

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

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

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

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

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

計數(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ù)組則不應(yīng)該再統(tǒng)計他了,則將相應(yīng)的位置減 1 即可,也就是 presum[9] = 10 - 1 = 9;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

見下圖。

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

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

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

  1. class Solution { 
  2.     public int[] sortArray(int[] nums) { 
  3.  
  4.         int len = nums.length; 
  5.         if (nums.length < 1) { 
  6.              return nums; 
  7.         } 
  8.         //求出最大最小值 
  9.         int max = nums[0]; 
  10.         int min = nums[0]; 
  11.         for (int x : nums) { 
  12.             if (max < x)  max = x;        
  13.             if (min > x)  min = x;          
  14.         } 
  15.         //設(shè)置 presum 數(shù)組長度,然后求出我們的前綴和數(shù)組, 
  16.         //這里我們可以把求次數(shù)數(shù)組和前綴和數(shù)組用一個數(shù)組處理 
  17.         int[] presum = new int[max-min+1]; 
  18.         for (int x : nums) { 
  19.             presum[x-min]++; 
  20.         } 
  21.         for (int i = 1; i < presum.length; ++i) { 
  22.             presum[i] = presum[i-1]+presum[i];  
  23.         } 
  24.         //臨時數(shù)組 
  25.         int[] temp = new int[len]; 
  26.         //遍歷數(shù)組,開始排序,注意偏移量 
  27.         for (int i = len-1; i >= 0; --i) { 
  28.             //查找 presum 字典,然后將其放到臨時數(shù)組,注意偏移度 
  29.             int index = presum[nums[i]-min]-1; 
  30.             temp[index] = nums[i]; 
  31.             //相應(yīng)位置減一 
  32.             presum[nums[i]-min]--;            
  33.         } 
  34.         //copy回原數(shù)組 
  35.         System.arraycopy(temp,0,nums,0,len); 
  36.         return nums; 
  37.     } 

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

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

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

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

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

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

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

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

  • 這是因為其當(dāng)數(shù)組元素的范圍太大時,并不適合計數(shù)排序,不僅浪費(fèi)時間,效率還會大大降低。
  • 當(dāng)待排序的元素非整數(shù)時,也不適用,大家思考一下這是為什么呢?

好啦,今天的文章就到這啦,我們下期再見,拜了個拜

 

責(zé)任編輯:武曉燕 來源: 袁廚的算法小屋
相關(guān)推薦

2014-03-17 09:31:36

Linux桌面

2013-12-18 14:17:00

操作系統(tǒng)邊緣化移動設(shè)備

2013-05-20 14:31:42

Google IO大會Android分裂無解

2015-09-15 08:46:27

代碼質(zhì)量結(jié)對編程

2011-11-30 09:07:13

云計算

2015-09-15 09:31:36

結(jié)對編程

2011-04-18 17:36:11

操作系統(tǒng)李彥宏

2010-06-22 15:35:03

UPS解決方案

2009-11-25 10:46:10

2017-03-17 15:49:16

群暉,備份、集中化備份

2017-10-20 12:33:46

2010-04-07 10:40:34

陳曉薇

2020-03-25 11:27:56

薪資標(biāo)準(zhǔn)互聯(lián)網(wǎng)

2015-08-04 17:03:52

支付寶微信

2025-04-07 08:00:00

大數(shù)據(jù)數(shù)字化數(shù)據(jù)治理

2021-08-09 14:41:48

手機(jī)配置電池

2022-07-18 14:14:06

零信任SASEIT

2025-04-14 09:19:00

2023-10-05 06:02:52

計數(shù)排序Counting

2021-01-20 10:40:16

緩存固態(tài)硬盤SSD
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

奇米狠狠一区二区三区| 国产午夜亚洲精品羞羞网站| 成人444kkkk在线观看| 男女啪啪在线观看| 日韩美女视频19| 国产日韩一区二区在线| 久久精品久久久精品美女| 国产精品久久久久av福利动漫| 少妇久久久久| 久久久久亚洲精品国产| 青青热久免费精品视频在线18| 日韩av最新在线观看| 92久久精品| 精品国产乱码91久久久久久网站| 成人三级黄色免费网站| 色综合久久久久久久| 樱花在线免费观看| 黄色成人在线免费| 你懂的在线网址| 欧美色综合久久| a级网站在线播放| 亚洲精品www久久久久久广东| 国产夫妻在线播放| 一本色道久久88精品综合| 久久99久久久精品欧美| 欧美老少做受xxxx高潮| 国产欧美自拍一区| 国产成人精品视| 中文字幕欧美日韩一区| 制服黑丝国产在线| 一个人看的www久久| 91禁在线看| 欧美中文字幕视频| 亚洲va欧美va人人爽午夜 | 精品自拍偷拍| 久久这里只有精品视频首页| 97久久超碰精品国产| 欧美高清影院| 在线国产伦理一区| 欧美精品日韩www.p站| 国产69精品久久777的优势| 亚洲欧洲精品在线| 日本久久精品电影| 久久99精品久久久野外观看| 成人黄色片视频网站| 国产成a人无v码亚洲福利| 深夜宅男网站免费进入| 国产青春久久久国产毛片| 尤物av一区二区| 污版视频在线观看| 久久精品二区| 99久久亚洲一区二区三区青草| 天天精品视频| 免费a级在线播放| 在线看视频不卡| 久久九九国产精品怡红院| 久久影院电视剧免费观看| 国产69精品久久app免费版| 欧美一卡二卡三卡四卡| 极品少妇xxxx偷拍精品少妇| 日本在线观看大片免费视频| 咪咪色在线视频| 亚洲综合色在线| 精品国产乱码久久久| 蜜桃成人av| 国产网友自拍电影在线| 色一情一伦一子一伦一区| 永久免费网站在线| 久久精品国产一区| 欧美色资源站| 久久青草福利网站| 亚洲天堂激情| 亚洲自拍偷拍色图| 视频一区视频二区在线观看| 国产欧美va欧美va香蕉在线| 亚洲影院天堂中文av色| 成人午夜激情免费视频| 日韩大胆成人| 欧美日产国产成人免费图片| 亚洲字幕久久| 激情视频国产| www.-级毛片线天内射视视| 成人av播放| 国产免费一区二区三区在线能观看| 国产日韩高清在线| 成人黄色在线网站| 国产成人精品三级高清久久91| 欧美激情精品| 伊人天天久久大香线蕉av色| 在线精品视频小说1| 奇米狠狠一区二区三区| 成人性视频欧美一区二区三区| 日韩福利视频在线观看| 久久天天综合| 老司机午夜在线| 精品国产综合| 欧美日韩亚洲综合| 国产精品av久久久久久麻豆网| 在线观看免费视频一区二区三区| 日韩av电影国产| 亚洲素人一区二区| 777亚洲妇女| 久久人人88| 亚洲人辣妹窥探嘘嘘| 日本成人黄色片| 亚洲美女毛片| 日韩欧美亚洲天堂| 欧美午夜一区二区三区免费大片| 色呦呦网站在线观看| a级黄色一级片| 天天色综合成人网| 国产精品国内免费一区二区三区| 国产三级免费观看| 国产精品最新在线观看| 狠狠色香婷婷久久亚洲精品| 欧美另类综合| 国产视频在线播放| 亚洲第一综合| 中文字幕国产亚洲| 久久精品视频一区| 免费久久久久久久久| 欧美电影精品一区二区| 97影院手机在线观看| 91久久国产精品91久久性色| 91豆麻精品91久久久久久| av成人激情| 亚洲色图官网| 国产a级片免费观看| 欧美专区日韩视频| 色拍拍在线精品视频8848| 噜噜爱69成人精品| 唐人社导航福利精品| 天天干天天综合| 91九色国产视频| 精品国产91乱码一区二区三区| 国产91露脸合集magnet| 91九色鹿精品国产综合久久香蕉| 黄页网站视频在线观看| 免费在线成人av电影| 中文字幕欧美日韩在线| 国产精品乱人伦中文| 欧美激情综合色综合啪啪| 三级在线看中文字幕完整版| 国产三级三级三级看三级| 国产欧美一区二区三区久久| 欧美精品在线观看播放| 粉嫩久久99精品久久久久久夜| 欧美人妖在线| 日本三级在线观看网站| 国产精品91视频| 国产成人福利视频| 国产亚洲精品久久久久久777| 亚洲无限av看| 欧洲另类一二三四区| 日本va欧美va精品| 欧一区二区三区| 尤物视频网站在线观看| 污片在线免费观看| 日本一本二本在线观看| 国产欧美最新羞羞视频在线观看| 日韩欧美国产电影| 国产精品美女一区二区三区| 国产日韩视频| 精品久久ai| √8天堂资源地址中文在线| 加勒比在线日本| 一区二区三区视频| 国产精品91免费在线| 亚洲精品永久免费| 欧美午夜性色大片在线观看| 成人黄色综合网站| 欧美日韩天堂| 51精品国产| 欧美精品video| 日本精品不卡| 成年网站免费| 又大又硬又爽免费视频| 亚洲在线视频福利| 国产69精品久久久| 亚洲精品国精品久久99热一| 色综合久久88色综合天天 | 欧美日本黄视频| 精品999久久久| 一本大道综合伊人精品热热| 国产精品午夜在线| 韩国v欧美v亚洲v日本v| 亚洲午夜精品久久久久久app| 乱亲女h秽乱长久久久| 电影一区二区三| 欧美videos极品另类| 轻轻色免费在线视频| 九一精品在线观看| 国产精品视频一二三四区| 久久综合九色欧美狠狠| 成人免费视频在线观看超级碰| 欧美日韩成人在线播放| 亚洲性生活视频在线观看| 日韩免费看网站| 欧美日韩国产在线观看| 婷婷一区二区三区|