Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 按k部分合并排序_Java_Sorting_Mergesort - Fatal编程技术网

Java 按k部分合并排序

Java 按k部分合并排序,java,sorting,mergesort,Java,Sorting,Mergesort,我真的很感激在这项任务上能得到一些帮助。 任务是开发一种合并排序算法,将输入数组递归地“拆分”为k个数组。我最初编写了两个方法,将排序合并为两部分,即合并排序和合并。我试图推广这个算法 公共类合并排序{ 公共静态int[]合并排序(int[]a,int p,int r){ //p是左界的 //r是右界的 if(p

我真的很感激在这项任务上能得到一些帮助。 任务是开发一种合并排序算法,将输入数组递归地“拆分”为k个数组。我最初编写了两个方法,将排序合并为两部分,即合并排序和合并。我试图推广这个算法

公共类合并排序{
公共静态int[]合并排序(int[]a,int p,int r){
//p是左界的
//r是右界的
if(p对于(int k=p;k,代码中存在一些问题:

  • 无需使用
    Math.floor()
    来截断整数除法的结果,与Javascript不同,Java对
    /
    int
参数和浮点参数使用不同的语义。
(p+r)/2
是整数商,但您可能需要编写
p+(r-p)/2
以避免潜在的p+r溢出
  • 当您从
    main()
    传递
    list.length
    时,上部索引将被排除。这实际上是一个非常方便的约定,可以避免在计算切片大小时需要
    +1
    调整。请删除这些错误调整,并依赖包含/排除的约定
  • 不要使用sentinel:使用sentinel会阻止您对包含大于或等于sentinel值
    100000000
    的数组进行正确排序。这种方法不是必需的,应该禁止。只需将索引变量与切片长度进行比较,并在其中一个切片用尽时复制其余元素即可
  • 您在
    mergeSortK
    中对切片边界的计算不正确:
    p+(r-p)/k*i
    是用整数算法计算的,因此
    (r-p)/k
    在乘法之前四舍五入。如果
    r-p
    不是
    k
    的倍数,则最后一个切片结束索引将不等于
    r
    。在除法之前相乘可以解决此问题,但可能会溢出类型
    int
    的范围
  • mergeSortK
    不执行k-way合并,而是执行一系列不适合
    k>2
    的部分合并
  • 您的测试集有点小
  • 以下是更正的版本:

    公共类合并排序{
    公共静态int[]合并排序(int[]a,int p,int r){
    //p为左边界(包括)
    //r为右界(不包括)
    如果(r-p>=2){
    int q=p-(r-p)/2;
    合并排序(a,p,q);
    合并排序(a、q、r);
    返回合并(a、p、q、r);
    }否则{
    返回a;
    }
    }
    //p为左边界(包括)
    //q是右切片的开始
    //r是右切片的末端(不包括)
    公共静态int[]合并(int[]a,int p,int q,int r){
    int n1=q-p;//第一个数组的长度
    int n2=r-q;//第二个数组的长度
    int[]lt=新的int[n1];
    对于(int i=0;ir-p)
    k=r-p;
    int[]pos=new int[k+1];//用于保存“拆分”索引的数组
    对于(int i=0;i 1){
    int i,n=1;
    对于(i=0;i

    mergeSortK
    的末尾,我没有编写正确的k-way合并阶段,上面的代码应该可以工作,但是会在ceil(log2(k))过程中合并k个片段。直接一次k-way合并很棘手,通常不值得。

    我认为这个想法是