Java 按k部分合并排序
我真的很感激在这项任务上能得到一些帮助。 任务是开发一种合并排序算法,将输入数组递归地“拆分”为k个数组。我最初编写了两个方法,将排序合并为两部分,即合并排序和合并。我试图推广这个算法Java 按k部分合并排序,java,sorting,mergesort,Java,Sorting,Mergesort,我真的很感激在这项任务上能得到一些帮助。 任务是开发一种合并排序算法,将输入数组递归地“拆分”为k个数组。我最初编写了两个方法,将排序合并为两部分,即合并排序和合并。我试图推广这个算法 公共类合并排序{ 公共静态int[]合并排序(int[]a,int p,int r){ //p是左界的 //r是右界的 if(p
公共类合并排序{
公共静态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
调整。请删除这些错误调整,并依赖包含/排除的约定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合并很棘手,通常不值得。我认为这个想法是