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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【算法精解】计数排序

發布時間:2023/12/10 编程问答 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【算法精解】计数排序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【算法精解】計數排序

  • 基本認識:是一個特殊的桶排序。基于比較排序的排序方法,其復雜度無法突破nlogn 的下限,但是非比較排序卻可以突破該下限,甚至達到O(n)的時間復雜度。當有n個數據時,所處的范圍并不大,最大值是k,那么就劃分k個桶。每個桶都存儲相同的數據。這樣可以省掉桶內排序的時間。
  • 時間復雜度:因為整個過程只涉及到掃描遍歷操作,所以時間復雜度是O(n+k)。【n為元素個數,k為待排序最大值與最小值之差】
  • 優缺點:適用于待排序數據的范圍不大的情況,若范圍比較大,會產生很多空桶,造成空間浪費。
  • 適用場景:以高考為例,假設某省有50萬考生,高考成績滿分是750分,我們可以分配751個桶(最低0分,最高750分),遍歷50萬考生的成績,劃分到751個桶中,最后只需要依次掃描桶,就可以輸出排序好的數據。
  • 排序思路
  • 對A[8]進行排序,其中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的數據再A[]中有兩個 2、對C[6]數組順序求和,C[k]存儲小于等于分數k的考生個數,C[6]={2,2,4,7,7,8}。//C[1]=2的含義為:A[]中 <= 1的值有兩個 3、新建一個數據R[8]用于存儲排序好的數據。 4、從后向前遍歷數據A[8],A[8]的倒數第一個數為3,C[6]下標為3的數為7,表明數組A中小于等于3的有7個人,所以講這個3放入R[8]的第7個位置,C[6]下標為3位置的數變為7-1=6。此時R[8]={0,0,0,0,0,0,3,0},C[6]={2,2,4,6,7,8}。 5、依次類推,掃描A[8]剩下的數據。最后R[8]就是排序好的數據。
  • Java代碼實現
  • 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("待排序數據:" + Arrays.toString(beforArr));int[] afterArr = countingSort(beforArr);System.out.println("排序之后數據:" + 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];//計算每個元素的個數,放入桶中for (int i=0; i<beforArr.length; i++){//最小值min對應數組索引0,依次類推bucket[beforArr[i]-min] ++;}//依次累加for (int i=1; i < size; i++){bucket[i] = bucket[i] + bucket[i-1];}//存放排序好數據的數組int[] afterArr = new int[beforArr.length];//倒序遍歷待排序數據for (int i=beforArr.length-1; i>=0; i--){//獲取對應桶下標存儲的個數int index = bucket[beforArr[i]-min] - 1;//存入afterArrafterArr[index] = beforArr[i];//對應桶下標存儲個數-1bucket[beforArr[i]-min] --;}return afterArr;} }

    ▄█?█●各位同仁,如果我的代碼對你有幫助,請給我一個贊吧,為了下次方便找到,也可關注加收藏呀
    如果有什么意見或建議,也可留言區討論

    總結

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

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。