数据结构——哈希排序

2023-11-19

哈希排序,就是用空间换取时间的一种排序方式,空间利用率达O(n)。

算法思想

如果一个元素序列a里没有重复的元素,而我们需要找最大值或者前几个最大值时,怎么办呢?
1、将这个a序列排序,然后直接选出目标值;
2、开辟一个b数组,a里的每一个元素对应b数组的下标,并将b数组该下标的元素设置为1。然后将b数组逆序遍历,就能得到目标值。方式2就是哈希排序的思想。
比如a的元素是[5,1,2,3,7],那么就是b[5]、b[1]、b[2]、b[3]、b[7]设置为1,其它位置的元素都是0。然后逆序遍历,从尾部往头开始遍历,先到b[7]时值为1,就输出下标7,以此类推就找到目标值了。
这个排序要求原始序列里元素各不相同,即每个元素都是唯一的。当然,如果有相同的数,那么只会输出一次(除非里面加上个循环输出)。

示例

输入10个不同的数字,找出前三大的值。

在这里插入图片描述
10个数字看不出来,貌似用其他排序算法排速度也差不多对吧?那我们大量一点的元素来看看:
如果我们设置28000个不同的数字,用快速排序和哈希排序的方式找出前三大的数字,会怎样呢?
这里我们引入时间函数来计算两者的耗时,得出了如下结果:
在这里插入图片描述
强行用空间换取时间很暴力吧?哪怕是用快速排序在28000个不同的元素里找出前三大的数字,都得用60ms,而哈希只需要1ms便完成了任务。

源代码

#include<iostream>
#include<stdio.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
#define maxnum 30000
int a[maxnum];
int b[maxnum];

void haxi(){
	int len;
	cout<<"数组长度?"; 
	cin>>len;
	for(int i=0;i<len;i++){
		cin>>b[i];
		a[b[i]]=1;
	}
	int premax;
	cout<<"找出前几大的数字?"; 
	cin>>premax;
	for(int i=maxnum;i>=0,premax>0;i--){
		if(a[i]==1){
			cout<<i<<" ";
			premax--;
		}
	}
}

int main(){	
	haxi();
	return 0;
} 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构——哈希排序 的相关文章

随机推荐

  • npm插件安装插件失败问题解决办法

    目录 问题索引列表 错误记录 在线地址pdf转word https www camscanner com pdftopic 问题索引列表 1 配置安装自定义位置nodejs 1 1 使用npm安装模块的位置有默认安装位置和指定安装位置 在W
  • Java自学第15天 面向对象(全)

    面向过程 面向对象 面向过程思想 步骤清晰简单 第一步做什么 第二步做什么 面对过程适合处理一些较为简单的问题 面向对象思想 物以类聚 分类的思维模式 思考问题首先会解决问题需要哪些分类 然后对这些分类进行单独思考 最后 才对某个分类下的细
  • javaSE进阶1之static用法

    JavaSE进阶 静态关键字 static static关键字的作用 成员变量分类 静态成员变量 实例成员变量 static修饰成员变量内存原理 static 修饰成员方法的基本用法 成员方法的分类 static修饰成员方法内存原理 sta
  • [原]Pro*C介绍-内嵌SQL

    Translate by Z Jingwei Document address http www db stanford edu ullman fcdb oracle or proc html Pro C介绍内嵌SQL 概要 Pro C语法
  • selenium自动化测试实战

    一 Selenium介绍 Selenium 是什么 一句话 自动化测试工具 它支持各种浏览器 包括 Chrome Safari Firefox 等主流界面式浏览器 如果你在这些浏览器里面安装一个 Selenium 的插件 那么便可以方便地实
  • Java开发中关于实体类的一些注解

    JSONField注解 FastJson中的注解 JSONField 一般作用在get set方法 常用的有以下三个场景 修改字段映射 private String name 实体类序列化为json字符串的时候 该类的name字段 序列化为
  • Integer 和 int

    一 区别 1 Integer是int的包装类 int则是java的一种基本的数据类型 2 Integer变量必须实例化之后才能使用 而int变量不需要实例化 3 Integer实际是对象的引用 当new一个Integer时 实际上生成一个指
  • Hadoop的安装与调试(2)

    本节内容包括 虚拟机的克隆 虚拟机配置 虚拟机IP配置 windows网络配置 虚拟机重命名 固定IP映射 设置mac地址 配置静态IP 测试 进入虚拟机 先登录用户 接下来用以下命令创建三个文件夹 四 虚拟机的克隆 1 先关闭虚拟机 2
  • 一文搞定attntion机制在CNN中的应用,手把手教你在Yolov5中插入attention. Attention结构的创新方法

    免责声明 1 此方法仅提供参考 2 搬了其他博主的操作方法 以贴上路径 3 场景一 什么是Attention 场景二 Attention在cnn上的作用 场景三 常见的Attention机制 场景四 Attention机制的创新思路 场景五
  • HTTP Status 500 - Request processing failed; nested exception is java.lang.IllegalArgumentException:...

    1 HTTP Status 500 Request processing failed nested exception is java lang IllegalArgumentException Control character in
  • U盘在别人电脑上正常显示,插在自己电脑读不出来(只显示CD驱动器)

    问题 同事A用U盘 从同事B电脑上拷贝文件 U盘插在其他同事电脑上都正常使用 插回自己电脑上读不出来 或者只显示CD驱动器 原因 种情况是驱动程序问题导致 可以把U盘插入电脑然后在设备管理里删掉设备重新插入即可 解决步骤 1 插上U盘 2
  • LLM大语言模型-MOSS解读

    原始blog在 notion 中 这里帖一个 notion的链接吧 LLM大语言模型 MOSS解读
  • VsFTP离线安装

    vsftp离线安装 安装包链接 https pan baidu com s 1qNmXWh3Ks5bzc rn1ytchQ 提取码 397i 1 查看服务器是否安装FTP 如图则表示没有安装 Shell gt rpm qa grep vsf
  • 云端开发加速是否可持续?

    云是否已经崛起还有待讨论 但是 目前 大多数开发项目都是在云端进行的 无论是纯云还是混合云 2022 年 Pluralsight 的一项研究表明 75 的组织都在云上构建新产品 云的优势显而易见 几乎无限的容量以及几秒内即可实现的按需扩展
  • C++用两个栈实现队列

    1 基础 队列 先进先出 即插入数据在队尾进行 删除数据在队头进行 栈 后进先出 即插入与删除数据均在栈顶进行 2 思路 两个栈实现一个队列的思想 用pushStack栈作为push数据的栈 用popStack栈作为pop数据的栈 只要是对
  • 如何解决项目管理中遇到的困难?

    其实是四个点 时间 成本 资源 范围 质量 1 这在四个点中 最重要的是质量 唯一不可变的也是质量 因此是一个以质量为中心的 三个点围绕的三角 2 基于第一点 在质量不变的情况下 考虑其它的三个点 时间 成本 范围 平衡也是在这三点之间平衡
  • 【毕业设计源码】基于Uniapp、Vue、Node的校园预约小程序系统(前后分离)

    功能描述 此系统包含小程序端和管理员后台端 小程序端是给用户预约操作的 具有以下模块 1 预约教室 2 取消预约 3 查看教室信息 4 收藏信息 包括新闻 教师 5 查看新闻 6 注册与登录PC管理后台是给后台管理员操作的 具有以下模块 1
  • Java数组笔记及算法练习

    Java数组笔记及算法练习 本文档创作于代码随想录算法训练营一期 参考文献链接 代码随想录 Java数组完全解析 java数组 超详细 文章目录 Java数组笔记及算法练习 1 数组基础 1 1一些基本说明 1 2数组的初始化 1 3数组的
  • 游戏修改器制作教程七:注入DLL的各种姿势

    教程面向有C C 基础的人 最好还要懂一些Windows编程知识 代码一律用Visual Studio 2013编译 如果你还在用VC6请趁早丢掉它 写这个教程只是为了让玩家更好地体验所爱的单机游戏 顺便学到些逆向知识 我不会用网络游戏做示
  • 数据结构——哈希排序

    哈希排序 就是用空间换取时间的一种排序方式 空间利用率达O n 算法思想 如果一个元素序列a里没有重复的元素 而我们需要找最大值或者前几个最大值时 怎么办呢 1 将这个a序列排序 然后直接选出目标值 2 开辟一个b数组 a里的每一个元素对应