java最全基础知识_Java编程入门,计数排序(Counting Sort)怎么做?
生活随笔
收集整理的這篇文章主要介紹了
java最全基础知识_Java编程入门,计数排序(Counting Sort)怎么做?
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
計數排序的核心在于將輸入的數據值轉化為鍵存儲在額外開辟的數組空間中。 作為一種線性時間復雜度的排序,計數排序要求輸入的數據必須是有確定范圍的整數。
計數排序(Counting sort)是一種穩定的排序算法。計數排序使用一個額外的數組C,其中第i個元素是待排序數組A中值等于i的元素的個數。然后根據數組C來將A中的元素排到正確的位置。它只能對整數進行排序。
算法描述
- 找出待排序的數組中最大和最小的元素;
- 統計數組中每個值為i的元素出現的次數,存入數組C的第i項;
- 對所有的計數累加(從C中的第一個元素開始,每一項和前一項相加);
- 反向填充目標數組:將每個元素i放在新數組的第C(i)項,每放一個元素就將C(i)減去1。
動圖演示
代碼實現
下面的排序算法統一使用的測試代碼如下,源碼GitHub鏈接
public static void main(String[] args) {int[] array = {3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48};// 只需要修改成對應的方法名就可以了countingSort(array);System.out.println(Arrays.toString(array)); }/*** Description: 計數排序** @param array* @return void* @author JourWon* @date 2019/7/11 23:42*/ public static void countingSort(int[] array) {if (array == null || array.length <= 1) {return;}int length = array.length;int max = array[0];int min = array[0];for (int i = 0; i < length; i++) {if (max < array[i]) {max = array[i];}if (min > array[i]) {min = array[i];}}// 最大最小元素之間范圍[min, max]的長度int offset = max - min + 1;// 1. 計算頻率,在需要的數組長度上額外加1int[] count = new int[offset + 1];for (int i = 0; i < length; i++) {// 使用加1后的索引,有重復的該位置就自增count[array[i] - min + 1]++;}// 2. 頻率 -> 元素的開始索引for (int i = 0; i < offset; i++) {count[i + 1] += count[i];}// 3. 元素按照開始索引分類,用到一個和待排數組一樣大臨時數組存放數據int[] aux = new int[length];for (int i = 0; i < length; i++) {// 填充一個數據后,自增,以便相同的數據可以填到下一個空位aux[count[array[i] - min]++] = array[i];}// 4. 數據回寫for (int i = 0; i < length; i++) {array[i] = aux[i];} }算法分析
當輸入的元素是n 個0到k之間的整數時,它的運行時間是 O(n + k)。計數排序不是比較排序,排序的速度快于任何比較排序算法。由于用來計數的數組C的長度取決于待排序數組中數據的范圍(等于待排序數組的最大值與最小值的差加上1),這使得計數排序對于數據范圍很大的數組,需要大量時間和內存。
最佳情況:T(n) = O(n+k) 最差情況:T(n) = O(n+k) 平均情況:T(n) = O(n+k)
優課達:面試被問排序不知道怎么辦?給你史上最全經典排序算法總結(Java實現)
優課達:程序員面試Java編程知識大全:最新版Java基礎知識面試題(一)
優課達:程序員面試Java編程知識大全:最新版Java集合容器面試題(一)
聽說給好內容點贊,知乎就會繼續給你推薦相關的優質回答,再也不怕沒學習素材了~~
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的java最全基础知识_Java编程入门,计数排序(Counting Sort)怎么做?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python字符串换行连接_零基础学py
- 下一篇: java美元兑换,(Java实现) 美元