找回密码
 欢迎注册
楼主: silitex

[原创] 位排序 -- 基于计数排序和基数排序产生的特例

[复制链接]
 楼主| 发表于 2009-11-4 14:05:26 | 显示全部楼层
很不幸,你的修改时错的,你增加i++,j--这行代码,然后运行一下我的测试程序就明白了。
liangbch 发表于 2009-11-4 12:18

厄,呵呵,在您的代码上如果仅仅增加i++,和j--这两行,是还不行的(当然,这也是我没有表达清楚意思,抱歉)。所以如果要解决不多判断一次,又让这个代码运行不出错,需要再另外处理一下,我的代码就进行了这样的一个处理。当然,话说回来,是我太追求细节了,为了尽量减少判断次数及移动次数,进行了单步跟踪及修正(自嘲)。
非常高兴和您的沟通!
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2009-11-4 14:07:29 | 显示全部楼层
看了一下周建钦写的那篇文章,本质上和我的代码是一致的。
liangbch 发表于 2009-11-4 12:31

是的,不过周在描述时间复杂度时疏漏了,应该为O(nlogm)(进行了n长度的logm次扫描),当然空间复杂度就是O(logm)(因为递归深度为logm)了
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-11-5 07:44:01 | 显示全部楼层
两位对此均有研究,探讨就可以更深入了。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-11-5 09:04:03 | 显示全部楼层
继续学习
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-11-5 10:48:04 | 显示全部楼层
21# silitex

对核心部分进行了优化,消除了潜在的错误。

  1. //bit 排序核心算法,这是一个递归函数
  2. void bitSort(DWORD *p, int begin, int end, DWORD mask )
  3. {
  4.         int i=begin;
  5.         int j=end;
  6.         DWORD t;
  7.        
  8.         if ( mask<=0)
  9.                 return ;

  10.         if (i>=j)
  11.                 return;
  12.        
  13.         while (i<j)
  14.         {
  15.                 while ( (p[ i ] & mask) ==0 && i<=j)
  16.                         i++;
  17.                 while ( (p[j] & mask) >0 && i<=j)
  18.                         j--;
  19.                
  20.                 if (i<j)
  21.                 {
  22.                         t=p[ i ];        p[ i ]=p[j]; p[j]=t;
  23.                         i++;
  24.                 }
  25.         }
  26.        
  27.         if (j<begin || i>end)        //没有左半部分,或者右半部分
  28.         {
  29.                 bitSort(p,begin,end,mask/2);
  30.         }
  31.         else  
  32.         {
  33.                 bitSort(p,begin,i-1,mask/2);
  34.                 bitSort(p,i,end,mask/2);
  35.         }
  36. }
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-11-5 11:10:42 | 显示全部楼层
周建钦写的代码,变量名称和数据类型稍有改动
//周建钦写的排序函数
  1. void zjq_sort(DWORD *a,int low,int high,DWORD mask)
  2. {
  3.         int i,j;
  4.         DWORD x; // x为临时变量
  5.         i=low;
  6.         j=high;
  7.         while(i<j)
  8.         {
  9.                 while ( (a[j] & mask) && i<j )  j--;
  10.                 while ( (a[i] & mask)==0 && i<j) i++;
  11.                 if(i<j)
  12.                 {
  13.                         x=a[j];
  14.                         a[j]=a[i];
  15.                         a[i]=x;
  16.                 }
  17.                 else
  18.                 {
  19.                         if( a[j] & mask) i--;
  20.                         else        j++;
  21.                         break;
  22.                 }
  23.         }

  24.         if(mask>1)
  25.         {
  26.                 if(low<i)  zjq_sort(a,low,i,mask/2);
  27.                 if(j<high) zjq_sort(a,j,high,mask/2);
  28.         }
  29. }
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2009-11-6 09:11:35 | 显示全部楼层
,学习了!liangbch写代码还真是认真啊!
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-5-3 21:56 , Processed in 0.057435 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表