silitex 发表于 2009-11-4 14:05:26



很不幸,你的修改时错的,你增加i++,j--这行代码,然后运行一下我的测试程序就明白了。
liangbch 发表于 2009-11-4 12:18 http://bbs.emath.ac.cn/images/common/back.gif
厄,呵呵,在您的代码上如果仅仅增加i++,和j--这两行,是还不行的(当然,这也是我没有表达清楚意思,抱歉)。所以如果要解决不多判断一次,又让这个代码运行不出错,需要再另外处理一下,我的代码就进行了这样的一个处理。当然,话说回来,是我太追求细节了,为了尽量减少判断次数及移动次数,进行了单步跟踪及修正(自嘲)。
非常高兴和您的沟通!

silitex 发表于 2009-11-4 14:07:29

看了一下周建钦写的那篇文章,本质上和我的代码是一致的。
liangbch 发表于 2009-11-4 12:31 http://bbs.emath.ac.cn/images/common/back.gif
是的,不过周在描述时间复杂度时疏漏了,应该为O(nlogm)(进行了n长度的logm次扫描),当然空间复杂度就是O(logm)(因为递归深度为logm)了

gxqcn 发表于 2009-11-5 07:44:01

两位对此均有研究,探讨就可以更深入了。:)

〇〇 发表于 2009-11-5 09:04:03

继续学习

liangbch 发表于 2009-11-5 10:48:04

21# silitex

对核心部分进行了优化,消除了潜在的错误。
//bit 排序核心算法,这是一个递归函数
void bitSort(DWORD *p, int begin, int end, DWORD mask )
{
        int i=begin;
        int j=end;
        DWORD t;
       
        if ( mask<=0)
                return ;

        if (i>=j)
                return;
       
        while (i<j)
        {
                while ( (p[ i ] & mask) ==0 && i<=j)
                        i++;
                while ( (p & mask) >0 && i<=j)
                        j--;
               
                if (i<j)
                {
                        t=p[ i ];        p[ i ]=p; p=t;
                        i++;
                }
        }
       
        if (j<begin || i>end)        //没有左半部分,或者右半部分
        {
                bitSort(p,begin,end,mask/2);
        }
        else
        {
                bitSort(p,begin,i-1,mask/2);
                bitSort(p,i,end,mask/2);
        }
}

liangbch 发表于 2009-11-5 11:10:42

周建钦写的代码,变量名称和数据类型稍有改动
//周建钦写的排序函数void zjq_sort(DWORD *a,int low,int high,DWORD mask)
{
        int i,j;
        DWORD x; // x为临时变量
        i=low;
        j=high;
        while(i<j)
        {
                while ( (a & mask) && i<j )j--;
                while ( (a & mask)==0 && i<j) i++;
                if(i<j)
                {
                        x=a;
                        a=a;
                        a=x;
                }
                else
                {
                        if( a & mask) i--;
                        else        j++;
                        break;
                }
        }

        if(mask>1)
        {
                if(low<i)zjq_sort(a,low,i,mask/2);
                if(j<high) zjq_sort(a,j,high,mask/2);
        }
}

silitex 发表于 2009-11-6 09:11:35

:),学习了!liangbch写代码还真是认真啊!
页: 1 2 [3]
查看完整版本: 位排序 -- 基于计数排序和基数排序产生的特例