java实现根号n路归并排序
最近算法课给了一道题:
思路:
对比二路归并算法,这个题的难点在于,根号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路归并排序相关推荐
- java获取当月有几天_你真的能在JAVA开发这条路上面一直坚持下去吗?
JAVA为什么有前途? 过去的十多年,JAVA基本每年都是全世界使用人数第一的语言.全世界数百万的IT企业构建了庞大的JAVA生态圈,大量的软件基于JAVA开发. JAVA也被誉为"计算机界 ...
- 卖任小龙java视频,任小龙Java大神之路(第九季 SpringMVC)视频教程叩丁狼教育出品...
大家好咱们开始上课,在正式上课之前咱们先花点时间来对我们接下来的这个课程,然后做一个大概的一个介绍 之前咱们讲的这个spring帝国,讲了十分的核心,对吧?然后在当初的时候咱们还有一块内容是没有讲到的 ...
- Java成神之路技术整理
转载自 Java成神之路技术整理 以下是Java技术栈微信公众号发布的所有关于 Java 的技术干货,会从以下几个方面汇总,本文会长期更新. Java 基础篇 Java 集合篇 Java 多线程篇 J ...
- java架构师之路:JAVA程序员必看的15本书的电子版下载地址
java架构师之路:JAVA程序员必看的15本书的电子版下载地址 作为Java程序员来说,最痛苦的事情莫过于可以选择的范围太广,可以读的书太多,往往容易无所适从.我想就我自己读过的技术书籍中挑选出来一 ...
- JAVA开发血泪之路:一步步搭建spring框架
JAVA开发血泪之路:一步步搭建spring框架 作为一个服务端开发感觉一直挺排斥框架这种东西的,总觉得什么实现逻辑都帮你封装在里面了,你只需要配置这配置那个,出了问题也不知道怎么排查,之前即使写we ...
- java 排序算法总结,Java排序算法总结之归并排序
本文实例讲述了Java排序算法总结之归并排序.分享给大家供大家参考.具体分析如下: 归并操作(merge),也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作.和快速排序类似,让我们一起来看 ...
- K路归并排序与败者树
一.大文件的排序问题 在我们日常开发中有时候会遇到这样一个问题,有一个文件大小为10GB,现在要为里面的数据进行排序,而计算机的内存只有1GB,如何对这10GB的数据进行排序呢? 由于内存空间只有1G ...
- C语言实现归并排序——2路归并排序
C语言实现归并排序 文章目录 C语言实现归并排序 2路归并排序算法 1.定义动态数组 2.初始化动态数组 3.归并操作 4.归并排序算法实现 项目完整代码 运行效果图 2路归并排序算法 1.定义动态数 ...
- Java的进化之路走到了尽头
目录 Java的进化之路走到了尽头 Java 的进化之路走到了尽头 编程语言进化的主干 如何保持先发优势 Java的进化之路走到了尽头 " 一百年后,人们使用什么语言开发软件?为什么这个问题 ...
最新文章
- PHP自动加载类—__autoload()和spl_autoload_register()
- 汇编-理解call,ret
- .NET DLR 上的IronScheme 语言互操作IronScheme控制台输入中文的问题
- 转载 为什么要有ibgp
- Linux内核中工作队列的使用work_struct,delayed_work
- 改来改去把微服务改成了分布式单体
- POJ 2315:Football Game(博弈论)
- 宝塔面板服务器ip地址修改_「网站」快速搭建服务器环境及网站
- 寻找优秀的AI公司与受人尊敬的资本助推者 | 量子位年度评选进行时
- 签证计算机专业敏感吗,签证中最常见被check的14个敏感专业
- 矩阵迹(trace), 行列式(determinate)
- mysql数据库表中重命名语句_mysql数据库重命名
- Springboot 前后端交互 Long类型传输 前端获取数据受限
- 专业编写c语言的软件,适合编写C语言代码的几款软件
- 【转发】RS485总线拓扑结构
- 常见sketch简介
- 产品通过WHQL认证后的好处
- MapX.h和MapX.cpp下载
- 无线降噪蓝牙耳机对比:NANK南卡和苹果AirPods Pro哪个好用?
- 关于如何构建数字资产量化的投资组合的思考