找回密码
 欢迎注册
楼主: 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. if ( mask<=0)
  8. return ;
  9. if (i>=j)
  10. return;
  11. while (i<j)
  12. {
  13. while ( (p[ i ] & mask) ==0 && i<=j)
  14. i++;
  15. while ( (p[j] & mask) >0 && i<=j)
  16. j--;
  17. if (i<j)
  18. {
  19. t=p[ i ]; p[ i ]=p[j]; p[j]=t;
  20. i++;
  21. }
  22. }
  23. if (j<begin || i>end) //没有左半部分,或者右半部分
  24. {
  25. bitSort(p,begin,end,mask/2);
  26. }
  27. else
  28. {
  29. bitSort(p,begin,i-1,mask/2);
  30. bitSort(p,i,end,mask/2);
  31. }
  32. }
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 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-11-22 12:09 , Processed in 0.024838 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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