Hark的数据结构与算法练习之鸽巢排序
算法说明
鸽巢排序是分布排序的一种,我理解其实鸽巢就是计数排序的简化版,不同之处就是鸽巢是不稳定的,计数排序是稳定的。
逻辑很简单,就是先找出待排数组的最大值maxNum,然后实例一个maxNum+1长度的数组。
例如待排数组int[] arrayData = { 22, 33, 57, 55, 58, 77, 44, 65, 58, 42 };
最大值是77.然后实例一个int[] arrayTemp = new int[77]的数组。
然后呢,循环arrayData。然后第一个数字是22, 那么arrayTemp[22]++。
然后第二个数字是33,那么arrayTemp[33]++。
接着arrayTemp[57]++
arrayTemp[55]++
.....
...
最后arrayTemp[42]++
最后将arrayTemp数组输出至原始数组中,那么原始数组就是排序后的数组了。
很easy吧!
代码
使用的是java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | package hark.sort.distributionsort; /* * 鸽巢排序 */ public class PigeonholeSort { public static void main(String[] args) { int [] arrayData = { 22 , 33 , 57 , 55 , 58 , 77 , 44 , 65 , 58 , 42 }; PigeonhomeSortMethod(arrayData); for ( int integer : arrayData) { System.out.print(integer); System.out.print( " " ); } } public static void PigeonhomeSortMethod( int [] arrayData) { int maxNum = 0 ; for ( int i = 0 ; i < arrayData.length; i++) { if (arrayData[i] > maxNum) { maxNum = arrayData[i]; } } int [] arrayTemp = new int [maxNum + 1 ]; for ( int i = 0 ; i < arrayData.length; i++) { arrayTemp[arrayData[i]]++; } int index = 0 ; for ( int i = 0 ; i < maxNum + 1 ; i++) { for ( int j = 0 ; j < arrayTemp[i]; j++) { arrayData[index++] = i; } } } } |
参考
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步