实现基数排序处理负数的情况
首先我们需要明白基数排序是使用内存换时间的经典算法,它对空间的要求比较高,我们普遍使用十个桶。这就对内存的消耗十分剧烈。如果我们基于原有的十个桶再为负数开辟十个桶,内存很有可能会爆。我们先将基数排序的代码放置在下面。
private void bucketSort(int[] arr,int left ,int right){int[][] bucket = new int[10][right-left+1];//构建桶int[] bucketElementCounts = new int[10];//记录每个桶中的元素的个数int a = 1,b = 0,max = 0;for (int i = left;i<=right;i++){max =(max>arr[i])?max:arr[i];}while (a<=max){for (int i = left;i<=right;i++){b = arr[i]/a%10;bucket[b][bucketElementCounts[b]] = arr[i];bucketElementCounts[b]++;}int index = left;for (int i = 0;i<bucketElementCounts.length;i++){if (bucketElementCounts[i] != 0){for (int j = 0;j<bucketElementCounts[i];j++){arr[index++] = bucket[i][j];}bucketElementCounts[i] = 0;}}a*=10;}}private void swap(int[] arr,int i ,int j){int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}
}
在自己想到这个方法之前我在csdn上找了很多答案,他们大多使用给所有元素加一个正数使所有的负数变为正数,正常情况下这样使用也不会出现太大问题。但如果是我们写题或者存在一个极大的数,我们在给他加值时很可能会溢出。导致计算错误。因此我们需要一个时间可以多消费一些时间,但不会导致错误的优化。
public void bucketSort(int[] arr){//重写bucketSort方法int i = 0;int j = arr.length-1;while(i<j){while(i<j && arr[i] <0){i++;}while(i<j && arr[j] >= 0){j--;}if (i < j){swap(arr,i,j);}}i--;j = arr.length-1;//上面的代码用于将arr分成两部分,由于负数总是比非负数小,从小到大排序也就是负数在前面int index = 0;for (int k = 0;k<=i;k++){if (arr[k] == Integer.MIN_VALUE){swap(arr,index++,k);}}for (int k = index;k<=i;k++){arr[k] *=-1;}//这一段我们处理负数部分,先将值为int类型中的最小值移动到最前端,将其余的部分都×-1使他 们变成正数bucketSort(arr,index,i);//变成正数的负数组排序for (int k = index;k<=i;k++){arr[k]*=-1;}//将所有变成正数的负数重现变成负数int temp = 0;for (int k = index;k<(i-index+1)/2+index;k++){swap(arr,k,i-temp);temp++;}//整体交换负数组的元素if (j>i){bucketSort(arr,i+1,j);//排序正数组}}
以上就是处理基数排序中出现负数的方法,能力有限,只能想到这了。多多包涵
实现基数排序处理负数的情况相关推荐
- 用计算机算账老是出负数是怎么回事,怎样处理账务上出现存货负数的情况
在我们做完帐对账务进行检查时,可能会出现账务上存货会出现负数的情况,这是不符合会计制度的.那么,如果账务上存货出现负数,我们应该怎么处理才合理呢?要知道处理方法,我们必须知道出现负数的原因,再进行不同 ...
- 经典十大排序算法(含升序降序,基数排序含负数排序)【Java版完整代码】【建议收藏系列】
经典十大排序算法[Java版完整代码] 写在前面的话 十大排序算法对比 冒泡排序 快速排序 直接选择排序 堆排序 归并排序 插入排序 希尔排序 计数排序 桶排序 基数排序 完整测试类 写在前面的话 ...
- byte转int出现负数的情况
问题描述: 在文件流读取十六进制文件时,经常需要将某些字节读出来解析成表示大小的int数据,在此转化过程中可能会出现负数,好的解决方法是将byte[i]和0xFF进行与运算,因为byte为8bit,而 ...
- java Date.getTime()返回负数异常情况分析
背景 在线上运行的一个数据库同步系统,突然在某一天发现了一条奇怪的数据. 出现了如下异常: SQL state [99999]; error code [17361]; Year out of ran ...
- 统治世界的十大排序算法!
来源:https://www.cnblogs.com/onepixel 0 算法概述 0.1 算法分类 十种常见排序算法可以分为两大类: 比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不 ...
- 数据结构和算法-排序算法(java实现)
文章目录 文章目录 文章目录 前言 内容 1.归并排序 2.堆排序 3.基数排序 4.冒泡排序 5.快速排序 6.希尔排序 7.插入排序 8.选择排序 总结 前言 建议大家还是看看目录,自测一下 提示 ...
- Java 必会10大的经典算法
本文来源: https://github.com/hustcc/JS-Sorting-Algorithm 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数 ...
- 数据结构十大经典排序算法总结
算法概述 算法分类 十种常见排序算法可以分为两大类: 比较类排序:通过比较来决定元素间的相对次数,由于其时间复杂度不能突破O ( n log n ) O(n \log n)O(nlogn),因此也 ...
- 高精度算法(加减乘除取模(均可以处理负数))
高精度算法 前言 大数加法 不可以处理负数的模板 可以处理负数 大数减法 两个数都是整数,且相减结果大于0 两个数都是正整数,相减结果可以是负数 两个数均可以是负数 高精度乘法 两个数均可以是负数 大 ...
最新文章
- nfs client高性能参数设置
- 老板居然让我用Java造假数据
- 学python可以干嘛-学完Python可以做什么?
- 基于深度学习的图像语义分割技术概述之4常用方法
- 安卓Dialog对话框多次显示而闪退的解决办法
- 流量计算机标准,流量计算机
- 条款11 在operator=中处理“自我赋值”
- wxpython SizerItem的大小控制
- 给WPS添加快捷键 智能粘贴 粘贴纯文本
- 如何在HTML标题中添加或改变图片
- Webstorm基本配置
- Mac上如何输入数学符号??
- Word中如何删除目录页的页码
- Idea主菜单不见了(File,View等工具栏隐藏了)
- 武汉大学计算机学院 论文,武大计算机学院教授分享:学术论文投稿与Rebuttal经验...
- Python数据处理之pandas基础入门
- 国际出版商Lulu 和Aspose 的渊源
- 超高人气机型 诺基亚N78手机图赏及评测
- 转行学计算机测试,转行软件测试后悔了
- 佳能 IP1600 IP1000 废墨清零方法和清零软件下载