如何实现在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代码实现如下:
public class HeapSort { public static void heapsort(int[] array){
int n=array.length; //求出原数组长度
if(n<=0)return; //如果数组长度为0,直接退出 int min=array[0],max=array[0];
System.out.print("排序前:");
for(int i=0;i<n;i++) //输出排序前的数组,并求出最大值和最小值
{
if(min>array[i])min=array[i];
if(max<array[i])max=array[i];
System.out.print(array[i]+" , ");
}
System.out.println(); int[] H=new int[max-min+1]; //哈希表
for(int i=0;i<H.length;i++) //初始化哈希表
H[i]=0; for(int i=0;i<n;i++) //哈希排序
H[array[i]-min]++; System.out.print("排序后:"); //输出排序后的数组
for(int i=0;i<H.length;i++)
for(int j=1;j<=H[i];j++)
System.out.print(i+min+" , ");
} public static void main(String[] args) {
int[] array={-5,6,9,15,-3,9};
heapsort(array); //调用哈希排序
} }
程序输出结果为:
排序前:-5 , 6 , 9 , 15 , -3 , 9 ,
排序后:-5 , -3 , 6 , 9 , 9 , 15 ,
如何实现在O(n)时间内排序,并且空间复杂度为O(1)的更多相关文章
- 日期时间插件flatpickr.js使用方法
今天写代码时需要用一款插件来实现对input输入时间的格式控制,找到了两款功能合适而且比较美观的插件:基于Bootstrap的DateTimePicker.js和flatpickr.js插件.一开始先 ...
- Java 8时间和日期API 20例
本文由 ImportNew - Sandy 翻译自 javarevisited.欢迎加入翻译小组.转载请见文末要求. 伴随lambda表达式.streams以及一系列小优化,Java 8 推出了全新的 ...
- Java 实现常见内排序
一.内排序 1.排序基本概念 (1)什么是排序? 排序指将一个数据元素集合或者序列 按照某种规则 重新排列成一个 有序的集合或者序列.分为内排序.外排序.排序算法的好坏直接影响程序的执行速度以及存储空 ...
- 各种排序算法及其java程序实现
各种排序算法:冒择路(入)兮(稀)快归堆,桶式排序,基数排序 冒泡排序,选择排序,插入排序,稀尔排序,快速排序,归并排序,堆排序,桶式排序,基数排序 一.冒泡排序(BubbleSort)1. 基本思想 ...
- 排序算法及其java实现
各种排序算法:冒择路(入)兮(稀)快归堆,桶式排序,基数排序 冒泡排序,选择排序,插入排序,稀尔排序,快速排序,归并排序,堆排序,桶式排序,基数排序 一.冒泡排序(BubbleSort) 1. 基本思 ...
- 计数排序(counting-sort)——算法导论(9)
1. 比较排序算法的下界 (1) 比较排序 到目前为止,我们已经介绍了几种能在O(nlgn)时间内排序n个数的算法:归并排序和堆排序达到了最坏情况下的上界:快速排序在平均情况下达到该上界. ...
- AutoCAD系统变量一览表
p.MsoNormal,li.MsoNormal,div.MsoNormal { margin: 0cm; margin-bottom: .0001pt; text-align: justify; t ...
- MyEclipse 8.5整合Git,并在Github上发布项目【转】
最近Git火得如日中天,而且速度体验和团队模式都很不错.手头正好有个学生实训项目,时间紧任务重,而且学校内网管理太紧,所以就想借助于Internet的分布式开发,因此想到了Github. 经过一天的调 ...
- MIT算法导论——第五讲.Linear Time Sort
本栏目(Algorithms)下MIT算法导论专题是个人对网易公开课MIT算法导论的学习心得与笔记.所有内容均来自MIT公开课Introduction to Algorithms中Charles E. ...
随机推荐
- 【转】__attribute__机制介绍
1. __attribute__ GNU C的一大特色(却不被初学者所知)就是__attribute__机制. __attribute__可以设置函数属性(Function Attribute).变量 ...
- Error Correct System(模拟)
Error Correct System Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I ...
- jquery工具
http://www.jqwidgets.com/jquery-widgets-documentation/documentation/jqxsplitter/jquery-splitter-gett ...
- top命令的解释
top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器.下面详细介绍它的使用方法. top - 01:06:48 up 1:22, ...
- Hadoop 安装(1) CENTOS 安装与配置
配置虚拟机,名字 Hadoop_Slave4,内存为1024MB,15GB. 进入安装centos. 配置Hostname: Slave4.Hadoop 配置网络,设置静态IP:192.168.1.2 ...
- js常用正则表达式汇总
常用的前台正则表达式汇总. 1.手机号验证 手机格式以1开头,现有的手机格式一般为13.14.15.17.18等 var regMobile = /^1[34578]\d{9}$/; //或者为/^1 ...
- VS2003,安装程序检测到另一个程序…
昨天在安装Visual Studio .Net 2003时,出现一个对话框 "安装程序检测到另一个程序要求计算机重新启动.必须重新启动计算机后才能安装visual studio.net系 ...
- FtpClient的使用
摘自:http://hi.baidu.com/yuanhotel/item/000b6334894d11f42784f4da Java的ftp操作 package com.why.ftp; impor ...
- php variance
function variance ($a) { /** variable and initializations */ $the_variance = 0.0; $the_mean = 0.0; $ ...
- golang Date format
package main import ( "fmt" "time" ) // @link https://golang.org/pkg/time/ func ...