最近算法课给了一道题:


思路:

对比二路归并算法,这个题的难点在于,根号n每次的子问题个数不定,是上个问题的根号n。但是还是能从二路归并中找到相似的思路。


代码:

package chapter1;import java.util.Arrays;public class MergeSort {static int count = 0;private static final int MAX_LENGTH = 211;private static int [] copy = new int[MAX_LENGTH];private static void createData(int [] a){for(int i  = 0;i< a.length ; i++){a[i] = (int) (Math.random()*1000);}for (int i : a) {System.out.print(i+" ");}System.out.println("\n------------------------------------before sort--------------------------");}private static void swap(int [] array,int left,int right){int temp = array[left];array[left] = array[right];array[right] = temp;}/*** 基础排序* @param array 数组* */private static void sort(int [] array,int left,int right){if(array.length == 2){if(array[left] > array[right])swap(array,left,right);}else{if(array[left] > array[left+1])swap(array,left,left+1);if(array[left] > array[right])swap(array,left,right);if(array[left+1] > array[right])swap(array,left+1,right);}System.out.println("in sort:");for(int i = left; i <= right;i++)System.out.print(array[i]+" ");System.out.println();}/*** 算法实现(递归)* @param Array 待排序的数组* * */private static void mergeSort(int [] array,int left,int right){if(right == left)return ;int len = right - left + 1;if(len == 2 || len ==3){sort(array,left,right);return ;}final int SQRT = (int) Math.sqrt(len);//根号nfinal int SIZE = (int) (len)/SQRT;//每一个打大小for(int i=0 ; i < SQRT ;i++ ){if(i != SQRT - 1)mergeSort(array, left+i*SIZE, left+i*SIZE+SIZE-1);elsemergeSort(array, left+i*SIZE,right);//array.length - 1}for (int s : array) System.out.print(s+" ");System.out.println("\n---------------"+count+++"----------------------");merge(array, left, right);}/*** 将根号n个数组合并起来,加入一个辅助数组* * */private static void merge(int [] array,int left , int right){int len = right - left +1;final int SQRT = (int) Math.sqrt(len);//根号nfinal int SIZE = (int) (len)/SQRT;//每一个打大小int [] [] a = new int[SQRT][];for(int i=0 ; i < SQRT ;i++ ){if(i != SQRT - 1)a[i] = Arrays.copyOfRange(array, left+i*SIZE, left+i*SIZE+SIZE);elsea[i] = Arrays.copyOfRange(array, left+i*SIZE, right+1);}int [] index = new int[SQRT];for(int j = left;j <= right ;j++){int min = Integer.MAX_VALUE;int flag = 0;for(int i=0 ; i < SQRT ;i++ ){if(index[i] == a[i].length)continue;if(a[i][index[i]] < min){min = a[i][index[i]];flag = i;}}index[flag]++;copy[j] = min;}for(int k = left ; k <= right ; k++)array[k] = copy[k];}public static void main(String[] args) {int[] array = new int[MAX_LENGTH];createData(array);mergeSort(array,0,array.length-1);System.out.println("----------------------after--------------------------");for (int i : array) {System.out.print(" "+i);}}}

输出:

ps:(这里我将MAX_LENGTH改为了17方便显示)

395 449 313 307 486 796 239 820 164 208 860 901 300 728 930 32 881
————————————before sort————————–
in sort:
395 449
in sort:
307 313
395 449 307 313 486 796 239 820 164 208 860 901 300 728 930 32 881
—————0———————-
in sort:
486 796
in sort:
239 820
307 313 395 449 486 796 239 820 164 208 860 901 300 728 930 32 881
—————1———————-
in sort:
164 208
in sort:
860 901
307 313 395 449 239 486 796 820 164 208 860 901 300 728 930 32 881
—————2———————-
in sort:
300 728
in sort:
32 881 930
307 313 395 449 239 486 796 820 164 208 860 901 300 728 32 881 930
—————3———————-
307 313 395 449 239 486 796 820 164 208 860 901 32 300 728 881 930
—————4———————-
———————-after————————–
32 164 208 239 300 307 313 395 449 486 728 796 820 860 881 901 930

结语

没有优化,而且没有仔细去检查,有问题可以评论中指出,谢谢

java实现根号n路归并排序相关推荐

  1. java获取当月有几天_你真的能在JAVA开发这条路上面一直坚持下去吗?

    JAVA为什么有前途? 过去的十多年,JAVA基本每年都是全世界使用人数第一的语言.全世界数百万的IT企业构建了庞大的JAVA生态圈,大量的软件基于JAVA开发. JAVA也被誉为"计算机界 ...

  2. 卖任小龙java视频,任小龙Java大神之路(第九季 SpringMVC)视频教程叩丁狼教育出品...

    大家好咱们开始上课,在正式上课之前咱们先花点时间来对我们接下来的这个课程,然后做一个大概的一个介绍 之前咱们讲的这个spring帝国,讲了十分的核心,对吧?然后在当初的时候咱们还有一块内容是没有讲到的 ...

  3. Java成神之路技术整理

    转载自 Java成神之路技术整理 以下是Java技术栈微信公众号发布的所有关于 Java 的技术干货,会从以下几个方面汇总,本文会长期更新. Java 基础篇 Java 集合篇 Java 多线程篇 J ...

  4. java架构师之路:JAVA程序员必看的15本书的电子版下载地址

    java架构师之路:JAVA程序员必看的15本书的电子版下载地址 作为Java程序员来说,最痛苦的事情莫过于可以选择的范围太广,可以读的书太多,往往容易无所适从.我想就我自己读过的技术书籍中挑选出来一 ...

  5. JAVA开发血泪之路:一步步搭建spring框架

    JAVA开发血泪之路:一步步搭建spring框架 作为一个服务端开发感觉一直挺排斥框架这种东西的,总觉得什么实现逻辑都帮你封装在里面了,你只需要配置这配置那个,出了问题也不知道怎么排查,之前即使写we ...

  6. java 排序算法总结,Java排序算法总结之归并排序

    本文实例讲述了Java排序算法总结之归并排序.分享给大家供大家参考.具体分析如下: 归并操作(merge),也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作.和快速排序类似,让我们一起来看 ...

  7. K路归并排序与败者树

    一.大文件的排序问题 在我们日常开发中有时候会遇到这样一个问题,有一个文件大小为10GB,现在要为里面的数据进行排序,而计算机的内存只有1GB,如何对这10GB的数据进行排序呢? 由于内存空间只有1G ...

  8. C语言实现归并排序——2路归并排序

    C语言实现归并排序 文章目录 C语言实现归并排序 2路归并排序算法 1.定义动态数组 2.初始化动态数组 3.归并操作 4.归并排序算法实现 项目完整代码 运行效果图 2路归并排序算法 1.定义动态数 ...

  9. Java的进化之路走到了尽头

    目录 Java的进化之路走到了尽头 Java 的进化之路走到了尽头 编程语言进化的主干 如何保持先发优势 Java的进化之路走到了尽头 " 一百年后,人们使用什么语言开发软件?为什么这个问题 ...

最新文章

  1. PHP自动加载类—__autoload()和spl_autoload_register()
  2. 汇编-理解call,ret
  3. .NET DLR 上的IronScheme 语言互操作IronScheme控制台输入中文的问题
  4. 转载 为什么要有ibgp
  5. Linux内核中工作队列的使用work_struct,delayed_work
  6. 改来改去把微服务改成了分布式单体
  7. POJ 2315:Football Game(博弈论)
  8. 宝塔面板服务器ip地址修改_「网站」快速搭建服务器环境及网站
  9. 寻找优秀的AI公司与受人尊敬的资本助推者 | 量子位年度评选进行时
  10. 签证计算机专业敏感吗,签证中最常见被check的14个敏感专业
  11. 矩阵迹(trace), 行列式(determinate)
  12. mysql数据库表中重命名语句_mysql数据库重命名
  13. Springboot 前后端交互 Long类型传输 前端获取数据受限
  14. 专业编写c语言的软件,适合编写C语言代码的几款软件
  15. 【转发】RS485总线拓扑结构
  16. 常见sketch简介
  17. 产品通过WHQL认证后的好处
  18. MapX.h和MapX.cpp下载
  19. 无线降噪蓝牙耳机对比:NANK南卡和苹果AirPods Pro哪个好用?
  20. 关于如何构建数字资产量化的投资组合的思考

热门文章

  1. Excel - 表格设置数字下拉数值不变不递增
  2. Linux下载ncbi的SRA文件
  3. 终于弄懂了origin批量制图
  4. android wear 2.0 访问网络,离线AI使Android Wear 2.0断网也智能回复
  5. endnote导入知网文献
  6. 怎么把二维码解码成链接地址?
  7. 《资治通鉴》—— 三家分晋
  8. The Elliptic Curve Digital Signature Algorithm(ECDSA)学习之路 - 签名验签流程
  9. Xcode-关于切换窗口的快捷键
  10. CAD7:构造线的使用 【TR剪掉多余的线】