boost filesystem 递归遍历目录
C++ 精确计算运行时间

C++ 自然归并排序

scturtle posted @ 2009年10月25日 22:06 in Other , 2707 阅读

课本上没有源码,但看起来思路不错,于是自己写了个

    void NaturalMergeSort(T a[], int n)
    {
        T *ta = new T [n];//临时数组
        int b[n];//包含各有序子序列断点
        int lenb=0;
        b[lenb++]=-1;//b[0]始终指首
        for (int i=0; i<n-1 ; i++ )//分断点
            if(a[i]>a[i+1]) b[lenb++]=i;
        b[lenb++]=n-1;//指尾

        while(lenb>2)//不断合并
        {
            int i=0,newlenb=1;
            for (i=0; i<lenb-2; i+=2)
            {
                Merge(a, ta, b[i]+1, b[i+1], b[i+2]);//相邻的两个两个合并
                for (int j=b[i]; j<=b[i+2]; j++ )//拷回
                    a[j]=ta[j];
                b[newlenb++]=b[i+2];//b一定越来越小,所以可以重复利用
            }

            if(i==lenb-2) b[newlenb++]=b[lenb-1];//处理最后的孤点
            lenb=newlenb;
        }
    }

    void Merge(T c[], T d[], int l, int m, int r)
    {
        // Merge c[l:m]] and c[m:r] to d[l:r].
        int i = l,    // cursor for first segment
                j = m+1,  // cursor for second
                    k = l;    // cursor for result

        // merge until i or j exits its segment
        while ((i <= m) && (j <= r))
            if (c[i] <= c[j]) d[k++] = c[i++];
            else d[k++] = c[j++];

        // take care of left overs
        if (i > m) for (int q = j; q <= r; q++)
                d[k++] = c[q];
        else for (int q = i; q <= m; q++)
                d[k++] = c[q];
    }

 


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter