7. 計數排序

思想

計數排序,不再依賴元素的比較,而是通過計數的方式,來進行排序。

比如,你知道成績比你高的有5個人,那麼你是多少名呢?計數排序就是採用這種思想。

計數排序,爲每一個元素設置一個計數,然後進行計數排序。

從這個思想上來看,計數排序會使用到複製的空間,而且輔助空間的數量爲 待排序數組的最大值-最小值+1。

從這個分析上,可以知道計數排序適用於 小範圍的排序,就是說待排序的數組,最大小值的差值不能太大。

實現

import java.util.Arrays;

public class CountSort {
    public static void main(String[] args) {
        int[] nums = {4, 6, 7, 2, 7, 8, 20, 2};
        int max_value = nums[0], min_value = nums[0];
        for (int i = 0; i < nums.length; i++) {
            max_value = Math.max(max_value, nums[i]);
            min_value = Math.min(min_value, nums[i]);
        }
        countSort(nums, max_value-min_value+1, min_value);
        System.out.println(Arrays.toString(nums));


    }

    public static void countSort(int[] nums, int count_value, int min_value){
        int[] count_array = new int[count_value];
        for (int i = 0; i < nums.length; i++) {
            count_array[nums[i]-min_value]++;
        }
        System.out.println(Arrays.toString(count_array));
        for (int i = 0, index = 0; i < count_array.length; i++) {
            int count = count_array[i];
            while(count--!=0) nums[index++] = min_value+i;
        }
    }
}

複雜度

首先,第一次遍歷待排序數組,確定最大值及最小值,利用此創建計數數組。時間複雜度爲O(n)

之後遍歷待排序數組,將相應位置的值放入計數數組,時間複雜度爲O(n)

最後遍歷計數數組,將其中計數值放入待排序數組,時間複雜度爲O(m) m爲最大小值的差值

所以,總的時間複雜度爲O(m+n)

空間複雜度爲O(m)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章