-
2019-09-01 13:01:24
哈希排序应该要和希尔排序区分开来,哈希排序的思想很简单的,典型的以空间换取时间的排序算法,其时间复杂度可以做到O(n)。简单来说就是打表,用数组下标来对应数值,用值来记录个数。具体实现看下面例子:
#include<bits/stdc++.h> using namespace std; int main() { int a[]={3,8,67,45,11,0,34,67,23,8} ; int arr[100];//注意开辟的数组大小要超过排序数字的最大值 memset(arr,0,sizeof(arr)); for(int i=0;i<10;i++) arr[a[i]]++; for(int i=0;i<100;i++) { while(arr[i]--) { cout<<i<<" "; } } return 0; }
注意:开辟的数组下标最大要大于排序数字;
其实负数也能够排序,比如你看:
#include<bits/stdc++.h> using namespace std; const int maxs = 200; int main() { int a[]={3,-8,-67,45,11,0,34,-67,23,-8} ; int arr[maxs];//注意开辟的数组大小要超过排序数字的最大值 memset(arr,0,sizeof(arr)); for(int i=0;i<10;i++) arr[100+a[i]]++; //注意加的数要够,不能让下标为负数,也不能超过数组最大小标 for(int i=0;i<maxs;i++) { while(arr[i]--) { cout<<i-100<<" "; } } return 0; }
这种算法也经常用来去重复,但是对于某些刁钻的数据也不太好用。
更多相关内容 -
哈希排序算法
2022-03-04 21:55:46哈希排序算法 说明 哈希算法是一种以空间换取时间的算法。 下面以一个例题的方式来进一步说明这个算法。 时间复杂度 O(n) 例题 问题描述 HDU 1425 “Sort” 给你n个整数,请按从大到小的顺序输出其中前m大的数。 ...哈希排序算法
说明
哈希算法是一种以空间换取时间的算法。
下面以一个例题的方式来进一步说明这个算法。
- 时间复杂度 O(n)
例题
问题描述
HDU 1425 “Sort” 给你n个整数,请按从大到小的顺序输出其中前m大的数。 输入:每组数据有两行,第一行有两个数n和m(0<n,m<1000000),第2行包含n个各不相同,且都处于区间[-500000,500000]的整数 输出:对每组测试数据从大到小的顺序排列并输出前m大的数 输入样例: 5 3 3 -35 92 213 -644 输出样例: 213 92 3
问题分析
对于本问题有以下信息
- 区间长度为1000001
- 从大到小输出
- 只输出m个
- 没有相同的数
在没有相同的数的情况下,我们很显然可以用哈希算法排序,且这个数组的大小为1000001。
具体思路就是,在输入数字t的时候,在数组a[500000+t]处标记为1,然后从数组最后开始向前检索,即a[i]处为1则输出500000-i,并依次打印m个这个数
题解
#include <bits/stdc++.h> using namespace std; //数组大小 #define MAXSIZE 1000001 //因为全局部分释放在堆中,所以数组写这里可以开得更大 int a[MAXSIZE]; int main() { int n,m; //因为本题数据较大,所以用ci比较慢改用scanf while(~scanf("%d%d",&n,&m)) { //将数组全部置为0以方便后面标记a[i] memset(a,0,sizeof(a)); for(int i=0; i<n; i++) { int t; scanf("%d",&t); //关键步骤 a[500000+t] = 1; //数字t,标记在这个位置,这样相当于在存放的时候就已经排好序了 } //开始从后往前检索m个数 for(int i=MAXSIZE-1; m>0; --i) { //若该处有标记 if(a[i]) { if(m>1) printf("%d ", i-500000); else printf("%d\n", i-500000); //最后一个数要换行单独处理 --m; //因为要输出m个数,所以每输出一次,m依次自减1 } } } return 0; }
-
算法技术手册 – 排序 – 桶排序/哈希排序/散列排序
2021-05-26 02:40:00在前面的计数排序中,我们已经领略到了如何用空间换时间的方法,找到一种线性时间复杂度O(N)的排序算法。计数排序的缺点也是非常明显的:...于是桶排序/哈希排序应运而生,假设值域范围还是k,我们不去创建k个bucket...在前面的计数排序中,我们已经领略到了如何用空间换时间的方法,找到一种线性时间复杂度O(N)的排序算法。
计数排序的缺点也是非常明显的:一旦数据范围[0,k),中的k]相对于数据量N非常稀疏,计数排序的空间会非常大、时间消耗也会增大非常大。当然主要还是空间问题。
个人认为:桶排序 = 哈希排序 = 散列排序,基本思想是一样的。
于是桶排序/哈希排序应运而生,假设值域范围还是k,我们不去创建k个buckets,而是创建m个木桶,让N个元素通过哈系函数映射到这k个桶即可。这里还有一个必须注意的大前提:哈希函数必须保证m个桶有序!即若i < j,则桶bi中的元素要小于桶bj中的元素。
一个这种哈希函数的例子,对0~1之间的浮点数映射到m个桶中
int hash(double *d, int m)
{
int bucket = m*(*d);
return bucket;
}
利用了C语言强制转换丢失精度的特性,非常巧妙吧!如此一来0.5的hash一定小于0.69!
哈希排序同时带来的问题是:一个桶中会含有多个元素,对这些元素的排序可以使用插入排序(在数据量小时,如n=4,插入排序是最快的。)
虽然插入排序的时间复杂读是O(N^2),但是散列平均的话,可以证明对每个桶内进行插入排序,其时间消耗是常数!即总体的散列排序/哈希排序的时间复杂度仍然是O(N)!!
因此,对于散列排序而言,桶k的个数越大,排序速度就会不断加快。当选择足够多的桶个数时,散列排序可以比快速排序更快!
散列排序不止可以用于数值,还可用于随机字符的排列,以26个字母为例:
我们将字符串的前3位想乘做为一个Hash函数,那么k的空间毫无疑问是26^3
#桶数量计算
int numBuckets()
{
return 26*26*26;
}
int hash(char* elem)
{
return (elem[0] - 'a')*26*26 +
(elem[1] - 'a')*26 +
(elem[2] - 'a');
}
只有在桶很少的情况下,散列排序的性能会退化接近于O(N^2)
-
哈希排序介绍
2021-11-28 20:54:35哈希排序是一种排序算法,方法是运用一个数组来记录需要排序的数中某个数是否出现过,也就是将该组数和数组的下标进行对应,从而实现排序。 听起来很麻烦是不是?话不多说,我们直接上代码: #include<bits/...今天不讲题目,直接给大家介绍一个听起来就很高大上的算法:哈希排序。
哈希排序是一种排序算法,方法是运用一个数组来记录需要排序的数中某个数是否出现过,也就是将该组数和数组的下标进行对应,从而实现排序。
听起来很麻烦是不是?话不多说,我们直接上代码:
#include<bits/stdc++.h> using namespace std; const int MAXN=1000001; int a[MAXN]; //数组a用来记录某个数是否出现过 int main(){ int n,m; while(~scanf("%d%d",&n,&m)){//输入n个数,输出从大到小的m个数(有多组数) memset(a,0,sizeof(a)); //数组充置为0 for(int i=0;i<n;i++){ int t; scanf("%d",&t); a[t]=1; //某个数出现过就把相应的数标记为1 } for(int i=MAXN;m>0;i--){ //查找最大的m个数,从后往前找 if(a[i]){ //代表i这个数出现过 if(m>1) {printf("%d",i);} else //m=1时换行,要输出下一组 {printf("%d\n",i);} m--; } } } return 0; }
(使用语言:c++)
通过上述代码,我们就可以实现将输入的数变为从大到小的多组数并输出了。
代码编写:刘泽溪
原理解释:孔浙凭
排版:徐庆尧
-
排序算法原理与实现[冒泡、选择、插入、快速、哈希、计数](python版)
2020-12-21 18:58:20将两个数中比较大的那个数交换到靠后的位置,不断交换下去就可以将最大的那两个数放到队列的尾部。然后重头再次交换)(交换list.lenght-1次),直到将数列排成有序数列。 代码实现 # -*- coding:utf-8 -*- """ Author:... -
最快的排序算法 java实现哈希算法-Java–哈希算法–最快的实现,排序算法数据结构
2022-04-07 15:14:46最快的排序算法 java实现哈希算法-Java–哈希算法–最快的实现,排序算法数据结构 -
哈希排序 java
2021-02-27 13:32:48初始 开始分组,分组个数为length/2,排完序后,再上次分组数除2,最后分为1组* 2.每次分组进行直接排序,将小的放前,大的放后面* 3.最后一次分组 整组比较,然后排序** 属于一种插入排序,也叫缩小增量排序* */... -
最快的排序算法 javahash实现-Java-哈希算法-最快的实现,排序算法数据结构
2022-04-07 15:15:00最快的排序算法 javahash实现-Java-哈希算法-最快的实现,排序算法数据结构 -
排序算法-哈希排序(HeapSort)
2018-09-11 00:53:01#include <iostream> #include &...#define N 10 using namespace std; //声明建大顶堆函数 void BuildMaxHeap(int * array); //声明堆排序函数 void HeapSort(int * array); //声明调... -
c + + 哈希表实现数字排序
2015-05-05 16:04:45每组测试数据有两行,第一行有两个数n,m(0,m),第二行包含n个处于区间[−500000,500000]的整数,每个数后有一个空格。 -
内部排序算法比较、哈希表设计
2013-05-12 22:49:46内部排序算法比较、哈希表设计 数据结构 -
排序哈希相似度以进行快速相似度搜索
2021-03-05 15:08:57在本文中,提出了一种算法,称为top k RHS(Rank Hash相似度),其中设计了一种排序损失函数来学习哈希函数。 假设哈希函数由1个二进制分类器组成。 学习哈希函数的问题可以表述为学习二进制分类器的任务。 该算法... -
2.0 哈希排序 7个常用排序之一
2022-05-11 14:29:39: 哈希排序 就是分组的插入排序,因为插入排序是 越有序速度越快,所以先分 n 组进行排序,等n组数据都是排成有序时,然后再将n 组数据 合在一起进行排序,这样速度可以快上很多. import java.util.Arrays; public ... -
【算法介绍】哈希排序算法
2019-09-25 01:21:14哈希排序算法(Hash),是目前我认为速度最快的排序算法之一,时间复杂度为O(n),而且我认为很简单。它的主体思路是:定义一个数组,每个元素表示它的下标在数列中的个数,最后用循环完成排序。 例如给你一个上限不... -
JS排序算法:冒泡法、快速排序法、选择排序法、插入排序法、哈希排序
2017-03-29 16:23:17JS排序算法:冒泡法、快速排序法、选择排序法、插入排序法、哈希排序//生成数组 var arr = new Array(1000); for (var i = 0; i ; i++) { arr[i] = (Math.round(Math.random() * 1000)); }1.冒泡法 排序思想:... -
C++ 排序算法小结 / 哈希表
2019-10-06 08:15:571.冒泡排序 2.插入排序 3.选择排序 4.归并排序 5.希尔排序 6.快速排序 7.堆排序 … 调用sort函数实现快速排序: //演示 #include <bits/stdc++.h> using namespace std; bool cmp(const int &... -
C#中哈希表(HashTable)用法实例详解(添加/移除/判断/遍历/排序等)
2020-09-02 02:49:52主要介绍了C#中哈希表(HashTable)用法,简单讲述了哈希表的原理并结合实例形式详细分析了C#针对哈希表进行添加、移除、判断、遍历、排序等操作的实现技巧,需要的朋友可以参考下 -
python 常见的排序算法实现汇总
2020-12-16 19:36:01要求能够手写时间复杂度位O(nlogn)的排序算法:快速排序、归并排序、堆排序 1.冒泡排序 思想:相邻的两个数字进行比较,大的向下沉,最后一个元素是最大的。列表右边先有序。 时间复杂度$O(n^2)$,原地排序,稳定的... -
对有大量重复数字的数组进行排序(哈希表应用)
2022-04-14 22:40:13常规排序法没有用到大量重复数字这个特性,应该想到用 hash 表来解决这个问题 3. 代码实现 package main import ( "fmt" "sort" ) func sortArr(a []int) []int { d := make(map[int]int) // key 用于存储原始... -
排序的三种常见方法(冒泡,快速,哈希)
2022-02-21 11:14:57输入:每组测试数据有两行,第一行有两个数n和m(0<n,m<1000000),第二行包含n个各不相同,且都处于区间[-500000,500000]的整数。 输出:对每组测试数据按从大到小的顺序输出前m大的数。 输入样例: 5 ... -
排序算法原理与实现[冒泡、选择、插入、快速、哈希、计数、归并](python版)
2020-03-30 19:52:27将两个数中比较大的那个数交换到靠后的位置,不断交换下去就可以将最大的那两个数放到队列的尾部。然后重头再次交换)(交换list.lenght-1次),直到将数列排成有序数列。 代码实现 # -*- coding:utf-8 -*- """ ... -
C++ 哈希表 排序整数
2020-03-21 11:44:48#include<stdio.h>... int random[10] = { 999,1,444,7,20,9,1,3,7,7 }; int hasp_map[1000] = { 0 }; for (int i = 0; i < sizeof(random) / sizeof(random[0]); i++) { hasp_map[random[... -
嵌入式学习DAY23 --- 排序、查找,哈希表,用哈希表编写一个 学生信息管理系统>
2021-03-28 11:30:52先构建一个有序的序列,遍历无序的序列,将无序的序列中的每一个元素和有序序列中的元素从后向前进行比较,如果比有序序列中的小,就继续比较,直到找到合适的位置,然后插入 void InsertSort (ElemTy -
哈希排序.doc
2012-05-09 16:53:50哈希排序详细介绍+案例分析 哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数... -
最快的排序算法 最快的内容查找算法-----暴雪的Hash算法,排序算法数据结构
2022-04-07 15:15:21最快的排序算法 最快的内容查找算法-----暴雪的Hash算法,排序算法数据结构 -
数据结构7/25作业——哈希查找、排序算法(冒泡排序、选择排序、插入排序、快速排序)
2022-07-25 18:33:43C语言数据结构——哈希查找、排序算法(冒泡排序、选择排序、插入排序、快速排序),哈希链表 哈希算法 结构体定义 初始化哈希表将元素存入哈希表定位要存储的链表将数据封装成节点 查看表函数 查找函数 定位要查找...