Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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
Algorithm 迭代/非递归合并排序_Algorithm_Sorting_Mergesort - Fatal编程技术网

Algorithm 迭代/非递归合并排序

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

我尝试了迭代合并排序,但在输入长度不是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
当输入长度为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。我想你可以提出