算法说明

鸽巢排序是分布排序的一种,我理解其实鸽巢就是计数排序的简化版,不同之处就是鸽巢是不稳定的,计数排序是稳定的。

逻辑很简单,就是先找出待排数组的最大值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

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;
}
}
}
}

  

参考

http://www.cnblogs.com/kkun/archive/2011/11/23/2260273.html

Hark的数据结构与算法练习之鸽巢排序的更多相关文章

  1. Hark的数据结构与算法练习之地精(侏儒)排序

    算法说明 地精排序是交换排序的一种,它是冒泡排序的一种改良,我感觉和鸡尾酒排序挺像的. 不同之处是鸡尾酒排序是从小到大,然后再从大到小切换着排序的.而地精排序是上来先从小到大排序,碰到交换到再从大到小 ...

  2. Hark的数据结构与算法练习之臭皮匠排序

    算法说明 个人感觉是没有意义的算法,只是用来作为学术研究.或者说开拓一下思维. 从wikipedia copy来的一句解释的话:Stooge排序是一种低效的递归排序算法,甚至慢于冒泡排序.在<算 ...

  3. Hark的数据结构与算法练习之简单选择排序

    /* * 简单选择排序 */ public class SimpleSort { public static void main(String[] args) { int[] arrayData = ...

  4. Hark的数据结构与算法练习之多路归并排序

    算法说明 多路归并排序也叫k路归并排序,实际上是归并排序的扩展版,同样也是归并排序的一种,通常的应用场景的针对大数据量的排序. 实现过程: 1.从字面可以看出,多路归并就是将待排的大数据量分成K路,然 ...

  5. C#实现鸽巢排序

    /// <summary> /// 鸽巢排序 /// 创建一个长度大于等于待排序数组array元素中最大值的标记数组mark, /// 将数组array中元素值个数映射到mark数组中. ...

  6. 鸽巢排序Pigeonhole sort

    原理类似桶排序,同样需要一个很大的鸽巢[桶排序里管这个叫桶,名字无所谓了] 鸽巢其实就是数组啦,数组的索引位置就表示值,该索引位置的值表示出现次数,如果全部为1次或0次那就是桶排序 例如 var pi ...

  7. Hark的数据结构与算法练习之若领图排序ProxymapSort

    算法说明 若领图排序是分布排序的一种. 个人理解,若领图排序算是桶排序+计数排序的变异版,桶排序计数排序理解了,那么若领图排序理解起来就会比较容易.区别其实就是存储中间值的方式做了调整…… 话说,这个 ...

  8. Java数据结构和算法(九)——高级排序

    春晚好看吗?不存在的!!! 在Java数据结构和算法(三)——冒泡.选择.插入排序算法中我们介绍了三种简单的排序算法,它们的时间复杂度大O表示法都是O(N2),如果数据量少,我们还能忍受,但是数据量大 ...

  9. 为什么我要放弃javaScript数据结构与算法(第十章)—— 排序和搜索算法

    本章将会学习最常见的排序和搜索算法,如冒泡排序.选择排序.插入排序.归并排序.快速排序和堆排序,以及顺序排序和二叉搜索算法. 第十章 排序和搜索算法 排序算法 我们会从一个最慢的开始,接着是一些性能好 ...

随机推荐

  1. DOS中如何删除文件夹

    可以使用rd命令.如果目录是空的,那么可以用 rd 目录删除目录.如下图:输入Y之后系统就会删除整个目录. 如果目录是非空,那么使用rd 目录 /s来删除目录(目录下的文件也会删除一同).如果没有加/ ...

  2. 我的前端MVC之路

    大约十几个月前,了解到时下前端MVC之火爆,同事推荐我了解一下angular.当时也不是特别在意,只是稍稍阅读了一遍官方文档,并尝试了文档上的例子.其实当时也颇有震惊之感的,原来代码还可以这么写!看完 ...

  3. Matlab之findobj()

    findobj findobj:特殊属性的图形对象 语法: 1.findobj: findobj返回根对象的句柄和所有子对象(findobj returns handles of the root o ...

  4. thinkphp中where方法

    今天来给大家讲下查询最常用但也是最复杂的where方法,where方法也属于模型类的连贯操作方法之一,主要用于查询和操作条件的设置.where方法的用法是ThinkPHP查询语言的精髓,也是Think ...

  5. 免费馅饼 Why WA

    免费馅饼 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 1576  Solved: 577 Description 都说天上不会掉馅饼,但有一天gameb ...

  6. 小希的迷宫(MST单棵树判断法则)

    小希的迷宫 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  7. java笔记--使用线程池优化多线程编程

    使用线程池优化多线程编程 认识线程池 在Java中,所有的对象都是需要通过new操作符来创建的,如果创建大量短生命周期的对象,将会使得整个程序的性能非常的低下.这种时候就需要用到了池的技术,比如数据库 ...

  8. Android相机、相册获取图片显示并保存到SD卡

    Android相机.相册获取图片显示并保存到SD卡 [复制链接]   电梯直达 楼主    发表于 2013-3-13 19:51:43 | 只看该作者 |只看大图  本帖最后由 happy小妖同学 ...

  9. HDU 1394 Minimum Inversion Number(线段树求逆序对)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1394 解题报告:给出一个序列,求出这个序列的逆序数,然后依次将第一个数移动到最后一位,求在这个过程中 ...

  10. [Effective JavaScript 笔记] 第13条:使用立即调用的函数表达式创建局部作用域

    function wrapElements(a){ var res=[],i,n; for(i=0,n=a.length;i<n;i++){ res[i]=function(){return a ...