鸽巢排序(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)的原理、排序思路、适用场景及代码示例相关推荐

  1. 经典排序算法 - 鸽巢排序Pigeonhole sort

    经典排序算法 - 鸽巢排序Pigeonhole sort 原理类似桶排序,同样需要一个很大的鸽巢[桶排序里管这个叫桶,名字无所谓了] 鸽巢其实就是数组啦,数组的索引位置就表示值,该索引位置的值表示出现 ...

  2. 排序算法:冒泡排序、插入排序、选择排序、希尔排序

    相关博客: 排序算法:冒泡排序.插入排序.选择排序.希尔排序 排序算法:归并排序.快速排序 排序算法:桶排序.计数排序.基数排序 排序算法:堆排序 十大排序算法小结 一.冒泡排序: 1.算法原理: 冒 ...

  3. c语言排序算法 应用与实现,基于C语言排序算法改进与应用.doc

    基于C语言排序算法改进与应用 基于C语言排序算法改进与应用 摘 要:介绍了程序语言中排序的原理及应用,阐述了基于C语言的三种主要排序方法,提出了每种排序方法的改进,计算出改进后算法的时间复杂度,编写了 ...

  4. 排序算法,最全的10大排序算法详解(Sort Algorithm)

    文章目录 排序算法,最全的10大排序算法详解(Sort Algorithm) 排序算法分类 排序算法稳定性 时间复杂度(time complexity) 1#时间复杂度的意义 2#基本操作执行次数 如 ...

  5. JS 排序算法详解(冒泡排序,选择排序,插入排序,希尔排序,快速排序)

    JS 排序算法详解(冒泡排序,选择排序,插入排序,希尔排序,快速排序) 一. 大O表示法 在进行排序算法之前,我们得先掌握一种对算法效率的表示方法,大O表示法. 我们使用大O表示法来表示算法的时间复杂 ...

  6. 排序算法(01)— 三种简单排序(冒泡、插入、选择)

    一.概述 排序是数据处理中十分常见且核心的操作,虽说实际项目开发中很小几率会需要我们手动实现,毕竟每种语言的类库中都有n多种关于排序算法的实现.但是了解这些精妙的思想对我们还是大有裨益的. 1.1 排 ...

  7. 经典排序算法(一) —— Selection Sort 选择排序

    经典排序算法(一) -- Selection Sort 选择排序 文章目录 经典排序算法(一) -- Selection Sort 选择排序 简介 排序过程 实现 复杂度 简介 选择排序是一种简单直观 ...

  8. java语言冒泡排序法_Java实现八个常用的排序算法:插入排序、冒泡排序、选择排序、希尔排序等...

    本文实现了八个常用的排序算法:插入排序.冒泡排序.选择排序.希尔排序 .快速排序.归并排序.堆排序和LST基数排序 首先是EightAlgorithms.java文件,代码如下: import jav ...

  9. 【Java】八个常用的排序算法:插入排序、冒泡排序、选择排序、希尔排序 、快速排序、归并排序、堆排序和LST基数排序

    这篇文章主要介绍了Java如何实现八个常用的排序算法:插入排序.冒泡排序.选择排序.希尔排序 .快速排序.归并排序.堆排序和LST基数排序,需要的朋友可以参考下 本文实现了八个常用的排序算法:插入排序 ...

  10. java排序算法(插入排序,冒泡排序,选择排序)

    java排序算法(插入排序,冒泡排序,选择排序) 先了解原理,然后自己跟着敲一下,加深印象 CMD编译命令:javac -encoding utf-8 SortList.java && ...

最新文章

  1. Zabbix添加Ping外网IP监控
  2. mysql pmm进程_mysql性能监控软件pmm
  3. asp.net三层架构连接Oracle 11g详解
  4. ActiveMq C#客户端 消息队列的使用(存和取)
  5. “Java跌落向下,Python奋斗向前”,程序员:看哭了...
  6. 最简单的ajax示例
  7. Android学习笔记---23_网络通信之网络图片查看器
  8. python字典弱引用_python 自身遍历及弱引用的简单示例
  9. 弃用 Oracle!
  10. 斐波那契数列-爬楼梯算法
  11. 安装Sql Server 2005 失败一例
  12. 在线2-36进制转文本工具
  13. poj 1185(状态压缩DP)
  14. FPGA Verilog 编写的 可调时 数字钟
  15. 报错org.apache.ibatis.builder.BuilderException: Error creating SqlSource for SqlProvider. Method ‘inse
  16. mac拷贝图片window打不开
  17. (转载)解决电脑同时使用有线网上内网,无线网上外网的冲突
  18. MicroStation里CASS地形数据生成三维地形模型
  19. [小样本医学图像]Generalized Organ Segmentation by Imitating One-shot Reasoning using Anatomical Correlation
  20. SAP 技术原理搬砖 - ARAP重分类:为啥我和外币评估设计原理不一样?

热门文章

  1. Linux驱动之TTY(一):概念
  2. 基于stm32的绘图机器人设计
  3. 路由器桥接显示无法连接服务器,路由器无法桥接怎么办
  4. Hibernate(八):检索策略
  5. boseqc35能不能连电脑_boseQC35耳机不能连接win10电脑如何解决
  6. (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  7. 示波器的带宽、带宽检定方法
  8. 全志A10/RK2918等七款平板芯片横向PK
  9. C#针式打印机自定义纸张连续打印爬坑过程
  10. 赏析角度有哪些_诗词赏析-怎样赏析诗词的技巧-诗句赏析的角度有哪些