排序算法--鸽巢排序(PigeonholeSort)的原理、排序思路、适用场景及代码示例

鸽巢排序(PigeonholeSort)

概念介绍

鸽巢排序是一种排序算法,适用于 元素数量可能值的数量 大致相同的元素列表的排序
它需要O(n + Range)时间,其中n是输入数组中元素的数量,而’ Range '是数组中可能的值的数量。

排序思路

  • 在数组中查找最小值和最大值。设最小值为“min”,最大值为“max”。可能值的数量范围range为’ max-min+1 '。
  • 设置一个初始为空的“鸽子洞”数组,其大小与range范围相同。
  • 访问数组中的每个元素,然后将每个元素放到它的鸽子洞中。一个元素arr[i]被放入索引arr[i] - min的洞中。
  • 按顺序在所有鸽巢数组中启动循环,并将非空洞中的元素放回原始数组中。

适用场景

鸽巢排序的用途有限,因为要求很少得到满足。对于范围远远大于n的数组,桶排序是一种在空间和时间上更有效的泛化方法。

源码示例

public class PigeonholeSortExample {
     
    public static void main(String[] args) {
     
        int arr[] = {
     8, 3, 2, 7, 4, 6, 8};
        pigeonholeSort(arr);
        print(arr);
    }

    public static void pigeonholeSort(int arr[]) {
     
        int n = arr.length;
        int min = arr[0];
        int max = arr[0];
        int range, i, j, index;

        for (int a = 0; a < n; a++) {
     
            if (arr[a] > max) {
     
                max = arr[a];
            }
            if (arr[a] < min) {
     
                min = arr[a];
            }
        }

        range = max - min + 1;
        int[] phole = new int[range];
        Arrays.fill(phole, 0);

        for (i = 0; i < n; i++) {
     
            phole[arr[i] - min]++;
        }

        index = 0;

        for (j = 0; j < range; j++) {
     
            while (phole[j]-- > 0) {
     
                arr[index++] = j + min;
            }
        }

    }
    static void print(int arr[]) {
     
        int n = arr.length;
        for (int i = 0; i < n; i++) {
     
            System.out.print(arr[i] + " ");
        }
        System.out.println();
    }
}

你可能感兴趣的:(算法,排序算法,鸽子洞排序,PigeonholeSort)