算法:用Java實現計數排序(CountSort)

本文我準備用Java實現計數排序(計數排序由於其獨有的排序方式,只適合待排序的數字都是非負整數的情況,且最大的數字不能太大,否則用於計數的數組將佔用過大的內存空間)。具體的排序算法過程已經在註釋裏面了,大家可以複製代碼到IDE裏面,用DEBUG模式研究算法的過程:

import java.util.Arrays;
import java.util.Random;

/**
 * @author LiYang
 * @ClassName CountSort
 * @Description 計數排序算法
 * @date 2019/11/5 17:17
 */
public class CountSort {
    
    /**
     * 計數排序算法(CountSort)
     * 注意:計數排序由於其獨有的排序方式,只適合
     * 待排序的數字都是非負整數的情況
     * @param arr 待排序數組
     */
    public static int[] countSort(int[] arr) {
        //求最大值,得出數組長度
        int max = 0;
        
        //遍歷求最大值
        for (int i = 0; i < arr.length; i++) {
            max = Math.max(max, arr[i]);
        }
        
        //用作計數的數組,初始化都爲0
        //注意,這裏數組的大小是max+1
        //因爲數組是從0開始的
        int[] count = new int[max + 1];
        
        //遍歷計數
        for (int i = 0; i < arr.length; i++) {
            //重要:count數組的作用是,如果這個數字出現了兩次,
            //則以這個數字作爲下標的值就是2,也就是計數
            //count數組就是計算每個數字出現了多少次,然後再
            //從大到小(數組遍歷)地將這些計數還原成有序數組
            count[arr[i]] ++;
        }
        
        //用作裝排序結果的數組
        int[] result = new int[arr.length];
        
        //上述數組的記錄下標
        int index = 0;
        
        //遍歷計數的數組,並處理計數結果
        for (int i = 0; i < count.length; i++) {
            
            //遇到計了數的
            if (count[i] > 0){
                
                //重要:i的大小就是元素大小,count[i]就是該元素的個數
                //將i元素裝count[i]次
                for (int elementNum = 0; elementNum < count[i]; elementNum++) {
                    result[index++] = i;
                }
            }
        }//計數排序統計完畢
        
        //返回計數排序完成的有序新數組
        return result;
    }

    /**
     * 驗證計數排序算法
     * @param args
     */
    public static void main(String[] args) {
        //待排序數組
        int[] arr = new int[30];

        //隨機數類
        Random random = new Random();

        //隨機生成排序數組(50以內的整數)
        for (int i = 0; i < arr.length; i++) {
            arr[i] = random.nextInt(50);
        }

        //打印待排序數組
        System.out.println("計數排序前:" + Arrays.toString(arr));

        //進行計數排序,返回排好序的新數組
        int[] countSortedArr = countSort(arr);

        //這裏可以將排好序的數組,重新賦給原來的數組,保持之前的操作
        arr = countSortedArr;

        //打印計數排序後的數組
        System.out.println("計數排序後:" + Arrays.toString(arr));
    }
    
}

運行 CountSort 類的main方法,計數排序算法測試通過:

計數排序前:[27, 31, 44, 0, 40, 37, 35, 28, 37, 9, 19, 30, 2, 40, 11, 5, 23, 9, 41, 6, 13, 34, 21, 14, 1, 8, 16, 1, 3, 42]
計數排序後:[0, 1, 1, 2, 3, 5, 6, 8, 9, 9, 11, 13, 14, 16, 19, 21, 23, 27, 28, 30, 31, 34, 35, 37, 37, 40, 40, 41, 42, 44]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章