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

カウントソート

原理

Counting Sortは、追加の配列Cを使用します。ここで、i番目の要素は、iに等しい値でソートされる配列A内の要素の数です。次に、配列Cに従って、Aの要素を正しい位置に配置します。実際、カウントソートは実際にはバケットソートの特殊なケースです。

カウントとソートの原則

  1. 配列Cを作成して、並べ替える配列の最大要素と最小要素を見つけます。
  2. 配列内の値iを持つ各要素の出現回数をカウントし、配列Cのi番目の項目に格納します。
  3. すべてのカウントを累積します(Cの最初の要素から開始して、各アイテムが前のアイテムに追加されます)。
  4. ターゲット配列を埋め戻します。各要素iを新しい配列のC(i)アイテムに入れ、各要素のC(i)から1を引きます。

コード

public class CountSort {
    
    
    public static void main(String[] args) {
    
    
        int[] array = {
    
    5,2,2,6,9,9,3,3,4};
        countSort(array);
        System.out.println(Arrays.toString(array));
    }
    public static void countSort(int[] array) {
    
    
        //求出待排序数组中的最大值和最小值,找出取值区间
        int max = array[0];
        int min = array[0];
        for (int i = 0; i < array.length; i++) {
    
    
            if (array[i] > max) {
    
    
                max = array[i];
            }
            if (min < array[i]) {
    
    
                min = array[i];
            }
        }
        //定义一个额外的数组C
        int bucketSize = max - min + 1;
        int[] bucket = new int[bucketSize];
        //统计对应元素的个数,数组的下标也对应着元素值
        for (int i = 0; i < array.length; i++) {
    
    
            int bucketIndex = array[i] - min;
            bucket[bucketIndex] += 0;
        }
        //对数组C内元素进行累加
        for (int i = 1; i < bucket.length; i++) {
    
    
            bucket[i] = bucket[i] + bucket[i - 1];
        }
        //创建临时数组R 存储最终有序IDE数据列表
        int[] temp = new int[array.length];
        //逆序扫描排序数组  保证元素的稳定性
        for (int i = array.length-1; i >=0; i--) {
    
    
            int bucketIndex = array[i] - min;
            temp[bucket[bucketIndex] - 1] = array[i];
            bucket[bucketIndex] -= 1;
        }

        for (int i = 0; i < temp.length; i++) {
    
    
            array[i] = temp[i];
        }

    }
}

1:カウントと並べ替えの時間計算量はどれくらいですか?

コードの実装を通じて、ソートのカウントには要素の比較は含まれず、バケット内の要素のソート(配列C)は含まれず、ソートされる配列と、カウントするためのトラバーサル操作のみが含まれることがわかりました。配列であるため、ソートのカウントの時間計算量はO(n + k)です。ここで、kはバケットの数、つまり、線形ソートアルゴリズムであるソートされるデータの範囲です。カウントソートは比較ソートではなく、ソートの速度はどの比較ソートアルゴリズムよりも高速です。カウントに使用される配列Cの長さkは、ソートされる配列内のデータの範囲に依存するため(ソートされる配列の最大値と最小値の差に1を加えたものに等しい)、これによりカウントが行われます。データ範囲が広い配列の並べ替え。多くの時間とメモリ。

2:カウントと並べ替えのスペースの複雑さは何ですか?

カウントと並べ替えのプロセスでは、カウントするために追加のバケットスペース(配列C)を作成する必要があります。したがって、カウントと並べ替えの複雑さは次のようになります。O(n + K)、ここでnはサイズデータとKはカウントです。並べ替えに必要なバケットの数は、実際にはカウントに使用される配列Cの長さです。前述したように、並べ替える配列内のデータの範囲によって異なります。

3:カウントソートは安定したソートアルゴリズムですか?

カウントと並べ替えのコア操作では、逆の順序で並べ替えられる配列をスキャンします。これにより、同じ値であるが並べ替えられる配列の下位位置にある要素は、最終的に並べ替えられた配列で同じ位置関係を維持できます。 、したがって、カウントはソートされます安定したソートアルゴリズムです。

4:カウントとソートに適用できるシナリオは?

カウントソートは、データ範囲が大きくないシナリオでのみ使用できます。データ範囲kがソートするデータnよりもはるかに大きい場合、カウントソートは適切ではありません。さらに、カウントソートでは非負の整数しかソートできません。ソートするデータが他のタイプの場合は、相対サイズを変更せずに非負の整数に変換する必要があります。

おすすめ

転載: blog.csdn.net/qq_33626996/article/details/113176958