如何实现在O(n)时间内排序,并且空间复杂度为O(1)
对于常见的排序算法,很难做到在O(n)时间内排序,并且空间复杂度为O(1),这里提供了一种方法可以达到要求。
可以使用哈希排序的思想,也就是将所有的数哈希到哈希表中,实现排序。具体的算法思想是,求出这组数据的最大值和最小值,分三种情况讨论:
1、如果最小值为负数,在哈希的时候把每个数都加上最小值的相反数,作为数组的下标值。
2、如果最小值为0,则直接将每个数作为下标值
3、如果最小值为正数,则将每个数减去最小值作为下标值
综合三种情况,可以归结为一个方法,就是令每个数减去最小值即可。
这样就可以建立一个数组,下标作为key,数组值作为value,初始化每个value为0,表示不存在对应的key值,当出现对应的key值时,就令其value值加1,如果存在重复的值,就将下标对应的value值重复加1计数,最后打印输出的时候,从头开始扫描数组,当value不为0时,将对应的key值加上或减去最小值输出即可,如果value大于1,就重复输出。
JAVA代码实现如下:
1 public class HeapSort { 2 3 public static void heapsort(int[] array){ 4 int n=array.length; //求出原数组长度 5 if(n<=0)return; //如果数组长度为0,直接退出 6 7 int min=array[0],max=array[0]; 8 System.out.print("排序前:"); 9 for(int i=0;i<n;i++) //输出排序前的数组,并求出最大值和最小值 10 { 11 if(min>array[i])min=array[i]; 12 if(max<array[i])max=array[i]; 13 System.out.print(array[i]+" , "); 14 } 15 System.out.println(); 16 17 int[] H=new int[max-min+1]; //哈希表 18 for(int i=0;i<H.length;i++) //初始化哈希表 19 H[i]=0; 20 21 for(int i=0;i<n;i++) //哈希排序 22 H[array[i]-min]++; 23 24 System.out.print("排序后:"); //输出排序后的数组 25 for(int i=0;i<H.length;i++) 26 for(int j=1;j<=H[i];j++) 27 System.out.print(i+min+" , "); 28 } 29 30 public static void main(String[] args) { 31 int[] array={-5,6,9,15,-3,9}; 32 heapsort(array); //调用哈希排序 33 } 34 35 }
View Code
程序输出结果为:
排序前:-5 , 6 , 9 , 15 , -3 , 9 ,
排序后:-5 , -3 , 6 , 9 , 9 , 15 ,
转载于:https://www.cnblogs.com/guozhenqiang/p/5424441.html
如何实现在O(n)时间内排序,并且空间复杂度为O(1)相关推荐
- java如何实排班表时间算法_java如何实排班表时间算法
java如何实排班表时间算法 [2021-02-09 22:33:43] 简介: php去除nbsp的方法:首先创建一个PHP代码示例文件:然后通过"preg_replace(" ...
- Autojs7实戦---薅羊毛时间版APK
薅羊毛时间版APK下载地址:薅羊毛时间版_v0.0.40.apk - 蓝奏云 薅羊毛时间版源代码下载地址:薅羊毛时间版源码.rar - 蓝奏云 薅羊毛时间表顾名思义就是支持时间账号,可以进行时间付费, ...
- java如何实排班表时间算法_安卓自定义View-日历型排班表-CalendarScheduleView
[原创,转载请注明出处] [使用效果] 未点击.jpg 点击.jpg 注释很详细,因此直接上代码: CalendarScheduleView.java /** * 日历型排班表 * 注意:只能显示本月 ...
- 明天就是第四周的实训开始的时间
认真做好没一件事情. 转载于:https://www.cnblogs.com/zzzzw/p/4771820.html
- 算法-时间频度 时间复杂度 空间复杂度
Temporal Frequency& Time Complexity& Space Complexity 计算算法执行时间 时间复杂度(Time Complexity) 常数阶O(1 ...
- 选购个人计算机小结,计算机实训小结精选 .doc
计算机实训小结精选 计算机实训小结 计算机对我来说异常陌生,因为我很少接触它,对它了解也很少,每次实际操作对我来说都很困难,我都会很紧张很烦躁,对它一点兴趣都没有.但是鉴于计算机在以后工作中 的重要性 ...
- java日期时间转日期_Java时间和日期指南
java日期时间转日期 长期以来,正确处理日期,时间,时区,夏令时,and年等一直是我的烦恼. 本文并不是一个全面的指南时域,请参阅日期和时间在Java中 -更详细,但略有下降,ekhem,日期. 它 ...
- Java时间和日期指南
长期以来,正确处理日期,时间,时区,夏时制,and年等一直是我的烦恼. 本文并不是一个全面的指南时域,请参阅日期和时间在Java中 -更详细,但略有下降,ekhem,日期. 它仍然是相关的,但是没有涵 ...
- 计算机网络计技术段标 实训,计算机网络技术实训报告精选.pdf
计算机网络技术实训报告精选 <计算机网络技术>实训报告 专 业 计算机应用技术 专 业 计算机应用技术 专专 业业 计计算算机机应应用用技技术术 系 别 电子信息工程系 系 别 电子信息工 ...
最新文章
- 圈复杂度本质上就是——分支覆盖率达到100%需要的测试用例数
- 常用linux下网络相关命令
- asp.net导出excel-一行代码实现excel、xml、pdf、word、html、csv等7种格式文件导出功能而且美观-SNF快速开发平台...
- 国内厂商 Onyx 违反 GPL 协议,中国开源何去何从?
- markdown 本地链接_五分钟快速入门Markdown
- MATLAB--高斯牛顿法
- 二叉树各种遍历算法 Java 实现总结
- vdbench的作用_vdbench
- Chrome浏览器模拟微信客户端访问网址,方法图文讲解模拟微信
- 关于计算机网络以下说法哪个正确().,青书学堂: (多选题) 关于计算机网络,以下说法哪个正确?( )(本题4.0分)...
- [转载] C#开发实战1200例(第I卷)目录
- window10删除2345流氓软件
- Linux系统下Qt项目实战(原神模拟器)
- MATLAB图像基本操作(信息查询/文件读取/写入/显示)
- 机器学习笔记丨神经网络的反向传播原理及过程(图文并茂+浅显易懂)
- Android 以图找图功能
- ublox F9P 开发板使用指南
- Java编程入门---JDK安装
- 音频信号 过零率 matlab,MATLAB计算信号短时平均过零率
- 规划IBM Spectrum Scale