Algorithm 迭代/非递归合并排序
我尝试了迭代合并排序,但在输入长度不是2^x的情况下,我被卡住了 像int[]A={4,5,1254,66,75,12,8,65,4,87,63,53,8,99,54,12,34}Algorithm 迭代/非递归合并排序,algorithm,sorting,mergesort,Algorithm,Sorting,Mergesort,我尝试了迭代合并排序,但在输入长度不是2^x的情况下,我被卡住了 像int[]A={4,5,1254,66,75,12,8,65,4,87,63,53,8,99,54,12,34} 公共类合并排序{ 公共静态无效排序(int[]A){ System.out.println(“Log(A.len):”+Log(A.length,2)); 对于(inti=0;i>1; 对于(int j=0;j+r
公共类合并排序{
公共静态无效排序(int[]A){
System.out.println(“Log(A.len):”+Log(A.length,2));
对于(inti=0;i>1;
对于(int j=0;j+r
当输入长度为2^x时,它可以正常工作
还有没有更好的方法来实现迭代版本,这看起来很混乱。C++自底向上合并排序示例。a[]是要排序的数组,b[]是临时数组。它包括检查合并过程的数量,如果过程的数量是奇数,则进行适当的交换,以便以[]中的排序数据结束
void BottomUpMerge(int a[], int b[], size_t ll, size_t rr, size_t ee);
void BottomUpCopy(int a[], int b[], size_t ll, size_t rr);
size_t GetPassCount(size_t n);
void BottomUpMergeSort(int a[], int b[], size_t n)
{
size_t s = 1; // run size
if(GetPassCount(n) & 1){ // if odd number of passes
for(s = 1; s < n; s += 2) // swap in place for 1st pass
if(a[s] < a[s-1])
std::swap(a[s], a[s-1]);
s = 2;
}
while(s < n){ // while not done
size_t ee = 0; // reset end index
while(ee < n){ // merge pairs of runs
size_t ll = ee; // ll = start of left run
size_t rr = ll+s; // rr = start of right run
if(rr >= n){ // if only left run
rr = n;
BottomUpCopy(a, b, ll, rr); // copy left run
break; // end of pass
}
ee = rr+s; // ee = end of right run
if(ee > n)
ee = n;
BottomUpMerge(a, b, ll, rr, ee);
}
std::swap(a, b); // swap a and b
s <<= 1; // double the run size
}
}
void BottomUpMerge(int a[], int b[], size_t ll, size_t rr, size_t ee)
{
size_t o = ll; // b[] index
size_t l = ll; // a[] left index
size_t r = rr; // a[] right index
while(1){ // merge data
if(a[l] <= a[r]){ // if a[l] <= a[r]
b[o++] = a[l++]; // copy a[l]
if(l < rr) // if not end of left run
continue; // continue (back to while)
do // else copy rest of right run
b[o++] = a[r++];
while(r < ee);
break; // and return
} else { // else a[l] > a[r]
b[o++] = a[r++]; // copy a[r]
if(r < ee) // if not end of right run
continue; // continue (back to while)
do // else copy rest of left run
b[o++] = a[l++];
while(l < rr);
break; // and return
}
}
}
void BottomUpCopy(int a[], int b[], size_t ll, size_t rr)
{
do // copy left run
b[ll] = a[ll];
while(++ll < rr);
}
size_t GetPassCount(size_t n) // return # passes
{
size_t i = 0;
for(size_t s = 1; s < n; s <<= 1)
i += 1;
return(i);
}
void BottomUpMerge(int a[],int b[],size\u t ll,size\u t rr,size\u t ee);
无效的底部拷贝(内部a[],内部b[],大小L,大小rr);
大小\u t GetPassCount(大小\u t n);
void BottomUpMergeSort(int a[],int b[],size\u t n)
{
大小\u t s=1;//运行大小
if(GetPassCount(n)&1){//if奇数次通过
对于(s=1;s=n){//如果只剩下左运行
rr=n;
BottomUpCopy(a,b,ll,rr);//复制左运行
break;//过程结束
}
ee=rr+s;//ee=右运行结束
如果(ee>n)
ee=n;
自底向上合并(a、b、ll、rr、ee);
}
std::swap(a,b);//交换a和b
sC++自底向上合并排序的示例。a[]是要排序的数组,b[]是临时数组。它包括检查合并传递的数量,如果传递的数量是奇数,则进行适当的交换,以便在a[]中得到排序的数据
void BottomUpMerge(int a[], int b[], size_t ll, size_t rr, size_t ee);
void BottomUpCopy(int a[], int b[], size_t ll, size_t rr);
size_t GetPassCount(size_t n);
void BottomUpMergeSort(int a[], int b[], size_t n)
{
size_t s = 1; // run size
if(GetPassCount(n) & 1){ // if odd number of passes
for(s = 1; s < n; s += 2) // swap in place for 1st pass
if(a[s] < a[s-1])
std::swap(a[s], a[s-1]);
s = 2;
}
while(s < n){ // while not done
size_t ee = 0; // reset end index
while(ee < n){ // merge pairs of runs
size_t ll = ee; // ll = start of left run
size_t rr = ll+s; // rr = start of right run
if(rr >= n){ // if only left run
rr = n;
BottomUpCopy(a, b, ll, rr); // copy left run
break; // end of pass
}
ee = rr+s; // ee = end of right run
if(ee > n)
ee = n;
BottomUpMerge(a, b, ll, rr, ee);
}
std::swap(a, b); // swap a and b
s <<= 1; // double the run size
}
}
void BottomUpMerge(int a[], int b[], size_t ll, size_t rr, size_t ee)
{
size_t o = ll; // b[] index
size_t l = ll; // a[] left index
size_t r = rr; // a[] right index
while(1){ // merge data
if(a[l] <= a[r]){ // if a[l] <= a[r]
b[o++] = a[l++]; // copy a[l]
if(l < rr) // if not end of left run
continue; // continue (back to while)
do // else copy rest of right run
b[o++] = a[r++];
while(r < ee);
break; // and return
} else { // else a[l] > a[r]
b[o++] = a[r++]; // copy a[r]
if(r < ee) // if not end of right run
continue; // continue (back to while)
do // else copy rest of left run
b[o++] = a[l++];
while(l < rr);
break; // and return
}
}
}
void BottomUpCopy(int a[], int b[], size_t ll, size_t rr)
{
do // copy left run
b[ll] = a[ll];
while(++ll < rr);
}
size_t GetPassCount(size_t n) // return # passes
{
size_t i = 0;
for(size_t s = 1; s < n; s <<= 1)
i += 1;
return(i);
}
void BottomUpMerge(int a[],int b[],size\u t ll,size\u t rr,size\u t ee);
无效的底部拷贝(内部a[],内部b[],大小L,大小rr);
大小\u t GetPassCount(大小\u t n);
void BottomUpMergeSort(int a[],int b[],size\u t n)
{
大小\u t s=1;//运行大小
if(GetPassCount(n)&1){//if奇数次通过
对于(s=1;s=n){//如果只剩下左运行
rr=n;
BottomUpCopy(a,b,ll,rr);//复制左运行
break;//过程结束
}
ee=rr+s;//ee=右运行结束
如果(ee>n)
ee=n;
自底向上合并(a、b、ll、rr、ee);
}
std::swap(a,b);//交换a和b
到目前为止,我所看过的每一本关于基本算法的书和脚本中都包含了s mergesort。我认为只要花20分钟阅读标准文献,你就可以想出一些方法。没错。现在再看一次我的句子。文献。Wiki有一个最小的例子。所谓最小,我的意思是它使用min()为了检查数组的结尾,它复制数据而不是交换指针,merge()会对移动的每个元素进行大量的条件检查。到目前为止,我所看到的关于基本算法的每本书和脚本都介绍了mergesort。我想你可以提出