轻松理解鸽巢排序【云图智联】

本文介绍了鸽巢排序,一种分配式排序算法。通过实例详细解释了如何处理不同情况(如元素非负、有正负数、有重复元素)下的排序步骤,并提供了Java代码实现。虽然鸽巢排序在特定条件下效率高,但因需要大量辅助空间,通常不用于通用排序场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶排序”(bucket sort)。为了说明这一算法,我们先以基数排序的一个特例鸽巢排序(Pigeonhole sort)来进行讲解。

鸽巢排序

1、数组中没有重复的元素,且每个元素都>=0

先考虑一种最简单的情况,对一个数组array:{11, 13, 56, 23, 63, 98 ,87}进行排序,注意这个数组中没有重复的元素,且都是>=0那么:

第一步:遍历这个数组,找出其中最大数字(maxNum)

第二步:创建一个辅助数组bucketArray,大小是maxNum+1,辅助元素中的每一个元素称之为一个"桶"

第三步:遍历待排序的数组array,将每一个元素分配(distribution)到辅助数组bucketArray中,分配的方式很简单,bucketArray[array[i]]=array[i],即直接将这个位置上的数字array[i]作bucketArray数组的下标,并给其赋值为array[i],即数组的下标和数组元素的值是相同的

QQ截图20170121162306.png

第四步:可以看到,经过第三步排序之后,辅助数组bucketArray中的元素已经有序的了,现在只需要迭代辅助数组,将不是null的元素依次拷贝到待排序数组中,即完成了排序

代码实现如下:

  1. public class PigeonholeSort {
  2.     /**
  3.      * 第一种情况:所有元素都>=0
  4.      */
  5.     public static void sort(int[] arr){
  6.  
  7.         //第一步,确定数组中最大的元素
  8.         int max=arr[0];
  9.         for (int i : arr) {
  10.             if(i>max){
  11.                 max=i;
  12.             }
  13.         }
  14.  
  15.         //第二步:创建辅助数组,大小为max+1,注意这里是Integer,所以默认每个元素的值都是null
  16.         Integer[] bucketArray=new Integer[max+1];
  17.  
  18.         //第三步:将数组中的分配到bucket数组中
  19.                 for (int i = 0; i < array.length; i++) {
  20.                     bucketArray[array[i]-minNum]=array[i];
  21.                 }
  22.  
  23.         //第四步:迭代辅助数组,将不是null的元素依次拷贝到待排序数组中
  24.  &n
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值