对于常见的排序算法,很难做到在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)相关推荐

  1. java如何实排班表时间算法_java如何实排班表时间算法

    java如何实排班表时间算法 [2021-02-09 22:33:43]  简介: php去除nbsp的方法:首先创建一个PHP代码示例文件:然后通过"preg_replace(" ...

  2. Autojs7实戦---薅羊毛时间版APK

    薅羊毛时间版APK下载地址:薅羊毛时间版_v0.0.40.apk - 蓝奏云 薅羊毛时间版源代码下载地址:薅羊毛时间版源码.rar - 蓝奏云 薅羊毛时间表顾名思义就是支持时间账号,可以进行时间付费, ...

  3. java如何实排班表时间算法_安卓自定义View-日历型排班表-CalendarScheduleView

    [原创,转载请注明出处] [使用效果] 未点击.jpg 点击.jpg 注释很详细,因此直接上代码: CalendarScheduleView.java /** * 日历型排班表 * 注意:只能显示本月 ...

  4. 明天就是第四周的实训开始的时间

    认真做好没一件事情. 转载于:https://www.cnblogs.com/zzzzw/p/4771820.html

  5. 算法-时间频度 时间复杂度 空间复杂度

    Temporal Frequency& Time Complexity& Space Complexity 计算算法执行时间 时间复杂度(Time Complexity) 常数阶O(1 ...

  6. 选购个人计算机小结,计算机实训小结精选 .doc

    计算机实训小结精选 计算机实训小结 计算机对我来说异常陌生,因为我很少接触它,对它了解也很少,每次实际操作对我来说都很困难,我都会很紧张很烦躁,对它一点兴趣都没有.但是鉴于计算机在以后工作中 的重要性 ...

  7. java日期时间转日期_Java时间和日期指南

    java日期时间转日期 长期以来,正确处理日期,时间,时区,夏令时,and年等一直是我的烦恼. 本文并不是一个全面的指南时域,请参阅日期和时间在Java中 -更详细,但略有下降,ekhem,日期. 它 ...

  8. Java时间和日期指南

    长期以来,正确处理日期,时间,时区,夏时制,and年等一直是我的烦恼. 本文并不是一个全面的指南时域,请参阅日期和时间在Java中 -更详细,但略有下降,ekhem,日期. 它仍然是相关的,但是没有涵 ...

  9. 计算机网络计技术段标 实训,计算机网络技术实训报告精选.pdf

    计算机网络技术实训报告精选 <计算机网络技术>实训报告 专 业 计算机应用技术 专 业 计算机应用技术 专专 业业 计计算算机机应应用用技技术术 系 别 电子信息工程系 系 别 电子信息工 ...

最新文章

  1. 圈复杂度本质上就是——分支覆盖率达到100%需要的测试用例数
  2. 常用linux下网络相关命令
  3. asp.net导出excel-一行代码实现excel、xml、pdf、word、html、csv等7种格式文件导出功能而且美观-SNF快速开发平台...
  4. 国内厂商 Onyx 违反 GPL 协议,中国开源何去何从?
  5. markdown 本地链接_五分钟快速入门Markdown
  6. MATLAB--高斯牛顿法
  7. 二叉树各种遍历算法 Java 实现总结
  8. vdbench的作用_vdbench
  9. Chrome浏览器模拟微信客户端访问网址,方法图文讲解模拟微信
  10. 关于计算机网络以下说法哪个正确().,青书学堂: (多选题) 关于计算机网络,以下说法哪个正确?( )(本题4.0分)...
  11. [转载] C#开发实战1200例(第I卷)目录
  12. window10删除2345流氓软件
  13. Linux系统下Qt项目实战(原神模拟器)
  14. MATLAB图像基本操作(信息查询/文件读取/写入/显示)
  15. 机器学习笔记丨神经网络的反向传播原理及过程(图文并茂+浅显易懂)
  16. Android 以图找图功能
  17. ublox F9P 开发板使用指南
  18. Java编程入门---JDK安装
  19. 音频信号 过零率 matlab,MATLAB计算信号短时平均过零率
  20. 规划IBM Spectrum Scale

热门文章

  1. .NET中如何通过文本框中按回车键进行的提交数据
  2. 同事间竞争,你该如何对待?
  3. 通过IHS(IBM HTTP SERVER)转发WAS(WEBSPHERE)应用的小问题
  4. 徐教授的对于商业模式创新的讲座!十分有用!
  5. 普林斯顿大学计算机科学与技术专业硕士项目拒信
  6. r shiny内部支持的输入函数
  7. 浅谈iOS 开发中的界面通信
  8. 诺基亚在2016年资本市场日上公布重点财务及战略目标
  9. Mac系统安装Aircrack-ng破解wifi密码(2)
  10. [转]jQuery选择器总结