Chinaunix首页 | 论坛 | 博客
  • 博客访问: 103261
  • 博文数量: 31
  • 博客积分: 115
  • 博客等级: 民兵
  • 技术积分: 165
  • 用 户 组: 普通用户
  • 注册时间: 2011-10-19 16:02
文章分类
文章存档

2013年(1)

2012年(9)

2011年(21)

分类:

2011-12-29 09:08:54

  最近在练习数据结构中的排序, 在写快速排序的时候发现排序出的结果总是不对,有几个0.但是我的数组里并没有0,经过调试,我发现是我的交换函数写错了!
   我的交换函数是用宏实现的,如下

  1. #define _SWAP_(x, y); \
  2. do{ \
  3. (x) = (x) + (y); \
  4. (y) = (x) - (y); \
  5. (x) = (x) - (y);
  6. }while(0);
  快速排序程序如下
  1. int quick_sort(Array *A)
  2. {
  3.     int left = 0, right = 0, privot = 0;

  4.     left = 1;
  5.     right = A->last;

  6.     list_number(A);
  7.     q_sort(A, left, right);

  8.     return TRUE_;
  9. }

  10. void q_sort(Array *A, int left, int right)
  11. {
  12.     int i = 0, j = 0;
  13.     int privot = 0;

  14.     list_number(A);
  15.     if (left < right) {
  16.         privot = A->elem[left].data;
  17.         i = left;
  18.         j = right+1;
  19.         do {
  20.             do {
  21.                 i++;
  22.             } while (A->elem[i].data < privot);    
  23.             do {
  24.                 j--;
  25.             } while (A->elem[j].data > privot);
  26.             if (i < j) {
  27.                 _SWAP_(A->elem[i].data, A->elem[j].data);        
  28.             }
  29.         } while (i < j);
  30.         _SWAP_(A->elem[left].data, A->elem[j].data);     //在此处有一种情况是i == j
  31.         q_sort(A, left, j-1);
  32.         q_sort(A, j+1, right);
  33.     }
  34. }
     快速排序里,当两个子序排列完成后,应该交换j 和 left下标所对应的值, 当排序到已经有序后j的值会和left的值相等,这时候调用我之前写的_SWAP_交换宏就错了。
     x = x+y; 
     y = x-y; 
     x = x-y;
   想要交换的值如果为同一个值,在第一行执行后, x变为的2x,而y和x本来就是一个值,所以也变为2x,再执行第2行的语句,“自己”-“自己”当然为0, x和y都变成0,第三句 x = 0 - 0, 所以这种写法的宏不能用于比较同一个值. 而且这种用+ -的宏只能用于数值的交换,如果是数组、结构体就不行,因为C语言不允许这两个结构进行四则运算操作。
   重新写一个交换宏
  1. #define _SWAP(x, y, Type);\
  2. do{ \
  3. Type temp; \
  4. temp = x; \
  5. x = y; \
  6. y = temp; \
  7. }while(0);

   或者重新写一个交换函数解决上述问题
  1. int swap(int *a, int *b)
  2. {
  3.     int temp = 0;

  4.     temp = *a;
  5.     *a = *b;
  6.     *b = temp;

  7.     return TRUE_;
  8. }
    

        
阅读(1078) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~