기수 정렬/버킷 정렬

알고리즘 사고

1. 카디널리티 정렬은 버킷 정렬이라고도 하며, 구체적인 아이디어는 배열의 첨자로 값을 저장하는 것입니다.
2. 모든 값을 꺼내서 비교합니다.예를 들어 값이 m이면 아래 첨자가 m인 배열에 저장됩니다.
3. 비교한 배열을 꺼내면 단위로 정렬된 배열이 되고 정렬된 배열을 10단위로 정렬합니다.
4. 십, 백, 천의 자릿수를 모두 비교하면 정렬이 완료됩니다.

그래픽 정렬 프로세스

여기에 이미지 설명 삽입

두 코드를 구현하는 아이디어는 동일하며 구현 방법 1은 C 또는 C++로 직접 다시 작성할 수 있습니다.

코드 구현 1

private int[] array = {
    
    23, 11, 7, 29, 33, 59, 8, 20, 9, 3, 2, 6, 10, 44, 83, 28, 5, 1, 0, 36};

/**
 * 基数排序,先按个位将所有数字按照个位的值放入0-9的二维数组中,依次取出之后再按十位
 * 如此循环直至个十百千等等所有位数遍历完为止
 */
private void radixSort() {
    
    

    // 定义二位数组用来存储每个基数以及基数下的数值
    int[][] temp;

    // 定义一维数组记录基数下保存了几位
    int[] position;

    int radix = 1;

    while (true) {
    
    
        position = new int[10];
        temp = new int[10][array.length];

        for (int i = 0; i < array.length; i++) {
    
    
            int value = (array[i] / radix) % 10;
            temp[value][position[value]] = array[i];
            position[value]++;
        }

        // 判断是否所有的数值都在0位上,都在0位上则表示排序完成
        if (position[0] == array.length) {
    
    
            break;
        }

        int index = 0;
        for (int i = 0; i < 10; i++) {
    
    
            for (int j = 0; j < position[i]; j++) {
    
    
                array[index] = temp[i][j];
                index++;
            }
        }

        radix = radix * 10;
    }
}

코드 구현 2

/**
 * 基数排序/桶排序
 */
public class BucktSort {
    
    

    /**
     * 待排序数组
     */
    private int[] originalArray;
    /**
     * 桶
     */
    private Map<String, List<Integer>> bucket;
    /**
     * 数组中,最长数字位数
     */
    private int maxLenght = 0;

    public BucktSort(int[] array) {
    
    
        originalArray = array;
        initBucket();
        getMaxLength();
    }

    private void initBucket() {
    
    
        if (null == bucket) {
    
    
            bucket = new HashMap<>(10);
        } else {
    
    
            bucket.clear();
        }
        for (int index = 0; index < 10; index++) {
    
    
            bucket.put(String.valueOf(index), new ArrayList<>());
        }
    }

    /**
     * 获取最长数字位数
     */
    private void getMaxLength() {
    
    
        for (int i = 0; i < originalArray.length; i++) {
    
    
            int temp = String.valueOf(originalArray[i]).length();
            if (temp > maxLenght) {
    
    
                maxLenght = temp;
            }
            continue;
        }
    }

    public int[] sort() {
    
    
        if (maxLenght == 0) {
    
    
            return originalArray;
        }

        int radix = 1;
        for (int index = 0; index < maxLenght; index++) {
    
    

            for (int i = 0; i < originalArray.length; i++) {
    
    
                String position = String.valueOf((originalArray[i] / radix) % 10);
                bucket.get(position).add(originalArray[i]);
            }

            int originalPosition = 0;
            for (int key = 0; key < 10; key++) {
    
    
                int j = 0;
                while (j < bucket.get(String.valueOf(key)).size()) {
    
    
                    originalArray[originalPosition] = bucket.get(String.valueOf(key)).get(j).intValue();
                    originalPosition++;
                    j++;
                }
            }

            initBucket();
            radix *= 10;
        }

        return originalArray;
    }

}

추천

출처blog.csdn.net/lrxb_123/article/details/115013190