当前位置: 首页 > 编程笔记 >

鸽眼排序

越信鸥
2023-03-14
本文向大家介绍鸽眼排序,包括了鸽眼排序的使用技巧和注意事项,需要的朋友参考一下

这是非比较排序技术的一个示例。在项目数和可能的键值范围大致相同的情况下使用。

为了执行这种排序,我们需要做一些漏洞。所需的孔数由数字范围决定。在每个孔中插入项目。最后从孔中删除并存储到数组中以进行排序。

鸽孔分选技术的复杂性

  • 时间复杂度:O(n + 2 ^ k)

  • 空间复杂度:O(2 ^ k)

输入输出

Input:
The unsorted list: 802 630 20 745 52 300 612 932 78 187
Output:
Data before Sorting: 802 630 20 745 52 300 612 932 78 187
Data after Sorting: 20 52 78 187 300 612 630 745 802 932

算法

pigeonHoleSort(array, size)

输入-数据数组,以及数组中的总数

输出-排序的数组

Begin
   find max and min from the array list
   holeRange := max – min +1
   define holeRange number of Lists

   for i := 0 to n-1 do
      hole[array[i]-min].append(array[i])
   done

   count := 0
   for j := 0 to holeRange-1 do
      while hole[j] is not empty do
         array[count] := get first node of hole[j] and delete it
         count := count +1
      done
   done
End

示例

#include<iostream>
#include<list>
#include<cmath>
using namespace std;

void getMaxMin(int *arr, int n, int &maximum, int &minimum) {
   maximum = minimum = arr[0]; //initially max and min ar arr[0]

   for(int i = 1; i<n; i++) {
      if(arr[i] > maximum)
         maximum = arr[i]; //get maximum data
      if(arr[i] < minimum)
         minimum = arr[i]; //get minimum data
   }
}

void pegionHoleSort(int *arr, int n) {
   int max, min;
   getMaxMin(arr, n, max, min);
   int holeRange = max - min +1;
   list<int> hole[holeRange]; //create an array of holes

   for(int i = 0; i<n; i++) {
      hole[arr[i]-min].push_back(arr[i]);
   }

   int count = 0;
   for(int j = 0; j<holeRange; j++) {
      //从链表中删除并存储到数组
      while(!hole[j].empty()) {
         arr[count] = *(hole[j].begin());
         hole[j].erase(hole[j].begin());
         count++;
      }
   }
}

void display(int *array, int size) {
   for(int i = 0; i<size; i++)
      cout << array[i] << " ";
   cout << endl;
}

int main() {
   int n;
   cout << "Enter the number of elements: ";
   cin >> n;
   int arr[n]; //create an array with given number of elements
   cout << "输入元素:" << endl;

   for(int i = 0; i<n; i++) {
      cin >> arr[i];
   }

   cout << "Data before Sorting: ";
   display(arr, n);
   pegionHoleSort(arr, n);
   cout << "Data after Sorting: ";
   display(arr, n);
}

输出结果

Enter the number of elements: 10
输入元素:
802 630 20 745 52 300 612 932 78 187
Data before Sorting: 802 630 20 745 52 300 612 932 78 187
Data after Sorting: 20 52 78 187 300 612 630 745 802 932
 类似资料:
  • 一、基础配置 第一步:创建信鸽账号 如没有信鸽账号,需要创建信鸽推送账号及应用,并在信鸽的管理控制台获得access_id和secret_key等参数。 第二步:在智能触达中配置信鸽账号 在诸葛「智能触达→设置→触达渠道→推送消息」中,找到「信鸽推送」,填入上一步中得到的access_id和secret_key参数并完成开通。 第三步:确认SDK中添加推送逻辑代码 Android: 在注册信鸽pu

  • 飞鸽传书是一款基于TCP/UDP的在局域网之内点对点传输信息和文件的工具。 飞鸽传书最早的版本由日本人 Shirouzu Hiroaki 于1994年编写( http://www.ipmsg.org/ )。经过几次升级后它已经支持RSA加密。 飞鸽传书.Net 是使用C#(早期版本为VB.net)编写,基于.Net框架运行的Windows应用程序。最早是出于学习网络编程目的而编写的,后不断地改进加

  • OSI网络协议 UI管理系统层级 Activity PhoneWindow DecorView TitleView和ContentView Kotlin ?和 !! java voliate 和 synchronized voliate修饰变量 synchronized修饰变量方法类 线程不阻塞 线程阻塞的 volaite可见 不是原子 不可见 原子操作 activity启动模式 内存泄露 单例模

  • 主要内容:确定页面类型,确定url规律,编写爬虫程序本节使用 Python 爬虫抓取猫眼电影网 TOP100 排行榜( https://maoyan.com/board/4)影片信息,包括电影名称、上映时间、主演信息。 在开始编写程序之前,首先要确定页面类型(静态页面或动态页面),其次找出页面的 url 规律,最后通过分析网页元素结构来确定正则表达式,从而提取网页信息。 确定页面类型 点击右键查看页面源码,确定要抓取的数据是否存在于页面内。通过浏览

  • 第一次大平台,很感谢给面试机会 1.面试官自我介绍 2.个人自我介绍 3.看我有两个项目和一个实习,都说一下学到什么,并遇到什么困难?(好家伙全待着经历问,我全背的八股) 4.我回答各个模块连接遇到问题,介绍项目分为哪几个模块? 5.将近三十分钟的项目和实习细问,存在什么缺陷,优化思路,具体如何? 6.写个题,二叉树的后序遍历,思路写出来了但是showmebug这个平台看明白输入输出,就跳过了。

  • 我有许多带有Lombok注释的类。 有没有办法将Getter、Setter、SuperBuilder、noargsconstuctor、allargsconstuctor、equals和hashcode注释挤压到任何一个可重用组件上? 我试图创建自定义注释 但Lombok注释仅在类、枚举或字段类型上受支持。