バケットソートの基数ソートをソートしてカウント

バケットソートの基数ソートをソートしてカウント

バケットソート

一般的なソートアルゴリズムは、バケットの限られた数に割り当てられたアレイによって動作し、各個々のバケットソート(再帰的にソートする方法一種のバケットを使用するか、他のソートアルゴリズムを使用し続けます)。

カウンティングソート

カウント配列決定は、バケットソートの特殊なケースです
カウンティングソート

  • 図から分かるように、数値は範囲[1,9]でソートされます。
  • 対応する数字をソートした浴槽に配置する空胴9を作成します。
  • 浴槽は、浴槽の外の要素の順序で順番にあります。

コードの実装:

public class CountSort {
    public static void main(String[] args) {
        int[] arr = {2, 4, 2, 3, 7, 1, 1, 1, 0, 5, 6, 9, 8, 7, 4, 0, 9};
        int[] result = sort(arr);
        System.out.println(Arrays.toString(result));
    }
    static int[] sort(int[] arr){
		//新建一个数组用来存放最终的结果
        int[] result = new int[arr.length];
        //10个桶
        int[] count = new int[10];
		//计数,计算每个桶中有多少个数字
        for (int i = 0; i < arr.length; i++) {
            count[arr[i]]++;
        }
        
        System.out.println(Arrays.toString(count));
        //累加数组,得到该桶的最后一个数字在最终数组中排在第几位的数字
        for (int i = 1; i < count.length; i++) {
            count[i] = count[i] + count[i-1];
        }
        System.out.println(Arrays.toString(count));
		//倒序迭代,将待排数字拿出放入累加数组中,得到结果数组中的位置,放入(建议拿出笔来算算)
        for (int i = arr.length-1; i >= 0; i--) {
            result[--count[arr[i]]] = arr[i];
        }
        return result;
    }
}

基数ソート

ここに画像を挿入説明

  • アルゴリズムのアイデア:マルチキーワードソート;
  • 同様に、数値の列は、バケット内に、それぞれ、このビット数十百、千に基づくであろう;

コードの実装:

public class RadixSort {

    public static void main(String[] args) {

        int[] arr = {421, 240, 225, 532, 305, 430, 124};

        int[] result = sort(arr);

        System.out.println(Arrays.toString(result));
    }

    public static int[] sort(int[] arr){
        int[] result = new int[arr.length];
        int[] count = new int[10];
		
        for (int i = 0; i < 3; i++) {
            int division = (int) Math.pow(10, i);
            System.out.println(division);
            //得到余数
            for (int j = 0; j < arr.length; j++) {
                int num = arr[j]/division % 10;

                System.out.print(num + " ");

                count[num]++;
            }
            System.out.println();
            System.out.println(Arrays.toString(count));

            for (int m = 1; m < count.length; m++) {
                count[m] = count[m] + count[m-1];
            }

            System.out.println(Arrays.toString(count));

            for (int n = arr.length-1; n >= 0; n--) {
                int num = arr[n]/division % 10;
                result[--count[num]] = arr[n];
            }
            System.arraycopy(result, 0, arr, 0, arr.length);
            Arrays.fill(count, 0);
        }
        return result;
    }
}

マンバ決してアウト

RIPマンバ
ここに画像を挿入説明

公開された25元の記事 ウォンの賞賛8 ビュー40000 +

おすすめ

転載: blog.csdn.net/FungLi_notLove/article/details/104089874