首先我们需要明白基数排序是使用内存换时间的经典算法,它对空间的要求比较高,我们普遍使用十个桶。这就对内存的消耗十分剧烈。如果我们基于原有的十个桶再为负数开辟十个桶,内存很有可能会爆。我们先将基数排序的代码放置在下面。

   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);//排序正数组}}

以上就是处理基数排序中出现负数的方法,能力有限,只能想到这了。多多包涵

实现基数排序处理负数的情况相关推荐

  1. 用计算机算账老是出负数是怎么回事,怎样处理账务上出现存货负数的情况

    在我们做完帐对账务进行检查时,可能会出现账务上存货会出现负数的情况,这是不符合会计制度的.那么,如果账务上存货出现负数,我们应该怎么处理才合理呢?要知道处理方法,我们必须知道出现负数的原因,再进行不同 ...

  2. 经典十大排序算法(含升序降序,基数排序含负数排序)【Java版完整代码】【建议收藏系列】

    经典十大排序算法[Java版完整代码] 写在前面的话 十大排序算法对比 冒泡排序 快速排序 直接选择排序 堆排序 归并排序 插入排序 希尔排序 计数排序 桶排序 基数排序 完整测试类 写在前面的话   ...

  3. byte转int出现负数的情况

    问题描述: 在文件流读取十六进制文件时,经常需要将某些字节读出来解析成表示大小的int数据,在此转化过程中可能会出现负数,好的解决方法是将byte[i]和0xFF进行与运算,因为byte为8bit,而 ...

  4. java Date.getTime()返回负数异常情况分析

    背景 在线上运行的一个数据库同步系统,突然在某一天发现了一条奇怪的数据. 出现了如下异常: SQL state [99999]; error code [17361]; Year out of ran ...

  5. 统治世界的十大排序算法!

    来源:https://www.cnblogs.com/onepixel 0 算法概述 0.1 算法分类 十种常见排序算法可以分为两大类: 比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不 ...

  6. 数据结构和算法-排序算法(java实现)

    文章目录 文章目录 文章目录 前言 内容 1.归并排序 2.堆排序 3.基数排序 4.冒泡排序 5.快速排序 6.希尔排序 7.插入排序 8.选择排序 总结 前言 建议大家还是看看目录,自测一下 提示 ...

  7. Java 必会10大的经典算法

    本文来源: https://github.com/hustcc/JS-Sorting-Algorithm 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数 ...

  8. 数据结构十大经典排序算法总结

    算法概述 算法分类 十种常见排序算法可以分为两大类: 比较类排序:通过比较来决定元素间的相对次数,由于其时间复杂度不能突破O ( n log ⁡ n ) O(n \log n)O(nlogn),因此也 ...

  9. 高精度算法(加减乘除取模(均可以处理负数))

    高精度算法 前言 大数加法 不可以处理负数的模板 可以处理负数 大数减法 两个数都是整数,且相减结果大于0 两个数都是正整数,相减结果可以是负数 两个数均可以是负数 高精度乘法 两个数均可以是负数 大 ...

最新文章

  1. nfs client高性能参数设置
  2. 老板居然让我用Java造假数据
  3. 学python可以干嘛-学完Python可以做什么?
  4. 基于深度学习的图像语义分割技术概述之4常用方法
  5. 安卓Dialog对话框多次显示而闪退的解决办法
  6. 流量计算机标准,流量计算机
  7. 条款11 在operator=中处理“自我赋值”
  8. wxpython SizerItem的大小控制
  9. 给WPS添加快捷键 智能粘贴 粘贴纯文本
  10. 如何在HTML标题中添加或改变图片
  11. Webstorm基本配置
  12. Mac上如何输入数学符号??
  13. Word中如何删除目录页的页码
  14. Idea主菜单不见了(File,View等工具栏隐藏了)
  15. 武汉大学计算机学院 论文,武大计算机学院教授分享:学术论文投稿与Rebuttal经验...
  16. Python数据处理之pandas基础入门
  17. 国际出版商Lulu 和Aspose 的渊源
  18. 超高人气机型 诺基亚N78手机图赏及评测
  19. 转行学计算机测试,转行软件测试后悔了
  20. 佳能 IP1600 IP1000 废墨清零方法和清零软件下载

热门文章

  1. qrcode.js生成二维码,无法识别
  2. IOS 使用照相机和图片库
  3. Android 平台通讯架构研究
  4. 打开浏览器突然多了个桔梗导航,怎么删除?
  5. 打开谷歌变成桔梗导航的解决方案
  6. TS:解决Linux无法登录,输入密码后显示module is unknown报错(已解决)-2021.1.5
  7. 将excel转换为Xml方法
  8. 基于Python的特定形状透明背景词云图绘制
  9. java list装箱,Java 自动装箱和拆箱
  10. 开一家美发店有哪些需求?