日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

【算法精解】计数排序

發(fā)布時(shí)間:2023/12/10 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【算法精解】计数排序 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

【算法精解】計(jì)數(shù)排序

  • 基本認(rèn)識(shí):是一個(gè)特殊的桶排序?;诒容^排序的排序方法,其復(fù)雜度無(wú)法突破nlogn 的下限,但是非比較排序卻可以突破該下限,甚至達(dá)到O(n)的時(shí)間復(fù)雜度。當(dāng)有n個(gè)數(shù)據(jù)時(shí),所處的范圍并不大,最大值是k,那么就劃分k個(gè)桶。每個(gè)桶都存儲(chǔ)相同的數(shù)據(jù)。這樣可以省掉桶內(nèi)排序的時(shí)間。
  • 時(shí)間復(fù)雜度:因?yàn)檎麄€(gè)過(guò)程只涉及到掃描遍歷操作,所以時(shí)間復(fù)雜度是O(n+k)。【n為元素個(gè)數(shù),k為待排序最大值與最小值之差】
  • 優(yōu)缺點(diǎn):適用于待排序數(shù)據(jù)的范圍不大的情況,若范圍比較大,會(huì)產(chǎn)生很多空桶,造成空間浪費(fèi)。
  • 適用場(chǎng)景:以高考為例,假設(shè)某省有50萬(wàn)考生,高考成績(jī)滿(mǎn)分是750分,我們可以分配751個(gè)桶(最低0分,最高750分),遍歷50萬(wàn)考生的成績(jī),劃分到751個(gè)桶中,最后只需要依次掃描桶,就可以輸出排序好的數(shù)據(jù)。
  • 排序思路
  • 對(duì)A[8]進(jìn)行排序,其中A[8] = {0,2,3,5,2,3,0,3},min=0,max=5 1、遍歷A[8],得到C[6]={2,0,2,3,0,1}。//C[0]=2的含義為:值為0的數(shù)據(jù)再A[]中有兩個(gè) 2、對(duì)C[6]數(shù)組順序求和,C[k]存儲(chǔ)小于等于分?jǐn)?shù)k的考生個(gè)數(shù),C[6]={2,2,4,7,7,8}。//C[1]=2的含義為:A[]中 <= 1的值有兩個(gè) 3、新建一個(gè)數(shù)據(jù)R[8]用于存儲(chǔ)排序好的數(shù)據(jù)。 4、從后向前遍歷數(shù)據(jù)A[8],A[8]的倒數(shù)第一個(gè)數(shù)為3,C[6]下標(biāo)為3的數(shù)為7,表明數(shù)組A中小于等于3的有7個(gè)人,所以講這個(gè)3放入R[8]的第7個(gè)位置,C[6]下標(biāo)為3位置的數(shù)變?yōu)?-1=6。此時(shí)R[8]={0,0,0,0,0,0,3,0},C[6]={2,2,4,6,7,8}。 5、依次類(lèi)推,掃描A[8]剩下的數(shù)據(jù)。最后R[8]就是排序好的數(shù)據(jù)。
  • Java代碼實(shí)現(xiàn)
  • public class Order {public static void main(String[] args) {int[] beforArr = {13, 19, 15, 11, 7, 11, 25, 21, 29, 17, 15, 14, 17, 29, 28, 22};System.out.println("待排序數(shù)據(jù):" + Arrays.toString(beforArr));int[] afterArr = countingSort(beforArr);System.out.println("排序之后數(shù)據(jù):" + Arrays.toString(afterArr));}public static int[] countingSort(int[] beforArr){int max = beforArr[0];//記錄最大值int min = beforArr[0];//記錄最小值for (int arr : beforArr) {//獲取最大值if (arr > max){max = arr;}//獲取最小值if (arr < min){min = arr;}}//記錄容器的大小int size = max - min + 1;//定義桶容器int[] bucket = new int[size];//計(jì)算每個(gè)元素的個(gè)數(shù),放入桶中for (int i=0; i<beforArr.length; i++){//最小值min對(duì)應(yīng)數(shù)組索引0,依次類(lèi)推bucket[beforArr[i]-min] ++;}//依次累加for (int i=1; i < size; i++){bucket[i] = bucket[i] + bucket[i-1];}//存放排序好數(shù)據(jù)的數(shù)組int[] afterArr = new int[beforArr.length];//倒序遍歷待排序數(shù)據(jù)for (int i=beforArr.length-1; i>=0; i--){//獲取對(duì)應(yīng)桶下標(biāo)存儲(chǔ)的個(gè)數(shù)int index = bucket[beforArr[i]-min] - 1;//存入afterArrafterArr[index] = beforArr[i];//對(duì)應(yīng)桶下標(biāo)存儲(chǔ)個(gè)數(shù)-1bucket[beforArr[i]-min] --;}return afterArr;} }

    ▄█?█●各位同仁,如果我的代碼對(duì)你有幫助,請(qǐng)給我一個(gè)贊吧,為了下次方便找到,也可關(guān)注加收藏呀
    如果有什么意見(jiàn)或建議,也可留言區(qū)討論

    總結(jié)

    以上是生活随笔為你收集整理的【算法精解】计数排序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。