カウントソートのソートアルゴリズム(Javaバージョン)

カウントソートは、比較に基づかないソートアルゴリズムです。その利点は、特定の範囲内の整数をソートする場合、その複雑さがΟ(n + k)(kは整数の範囲)であり、どの比較ソートアルゴリズムよりも高速であるということです。もちろん、これは時間のためにスペースを犠牲にするアルゴリズムです。

基本的な考え方

カウントと並べ替えの基本的な考え方は、入力要素xごとに、x未満の要素の数を決定することです。たとえば、7つの要素がxより小さい場合、xは8番目の出力位置にある必要があります。

作業工程

  • 準備:
    入力配列:array[1 ... n]。
    出力配列:result[1 ... n]。
    配列を一時的に保存しcountArrayます[0 ... k]。
  • 計算arrayの各要素の数を計算し、それをcountArray配列に格納します。配列arrayの要素の値をcountArray配列の添え字として取得すると、配列arraycountArray対応する要素が+1になるたびに、配列の要素が1回繰り返されます。
  • 配列array内の現在の要素より少ない数=countArray現在の要素と配列内の前の要素合計を計算ます。そして、データをcountArray配列に更新します
  • countArray決定によると、配列内の現在arrayの要素は、配列内のresult格納位置の配列内の要素の数よりも少ない

コード

    /**
     * 计数排序
     * @param array 待排序数组
     * @param k 临时数组长度,取值为排序数组的最大值+1
     *          (此处是因为 array 中的元素被作为数组下标,所以数组长度为最大值+1)
     */
    private static void countSort(int[] array, int k) {
    
    
        //创建计数统计数组
        int[] countArray = new int[k];
        //计算 array 中每个元素的重复个数
        for (int i = 0; i < array.length; i++) {
    
    
            countArray[array[i]] += 1;
        }
        //计算数组中小于当前元素的元素个数
        for (int i = 0; i < k; i++) {
    
    
            if (i > 0) {
    
    
                countArray[i] = countArray[i] + countArray[i - 1];
            }
        }
        //结果输出数组
        int[] result = new int[array.length];
        //将 array 中的元素存放到 result 指定位置
        for (int i = array.length - 1; i >= 0; i--) {
    
    
            System.out.println("array:" + array[i] + " | countArray:" + countArray[array[i]]);
            //计算存放位置(小于当前元素的数量值-1即为数组下标)
            int pos = countArray[array[i]] -1;
            //根据计数统计数组将数组array中的元素存放到result数组中
            result[pos] = array[i];
            //小于当前元素的数量值-1
            countArray[array[i]] = pos;
        }
        
        System.out.println(Arrays.toString(result));

    }

更新が遅れました、ハハ。カウントソートは一般的に使用されていないアルゴリズムのようですが、他の比較ソートと比較してアイデアは比較的単純であり、学ぶ価値があります。

おすすめ

転載: blog.csdn.net/lijie2664989/article/details/85042679