最近在练习数据结构中的排序, 在写快速排序的时候发现排序出的结果总是不对,有几个0.但是我的数组里并没有0,经过调试,我发现是我的交换函数写错了! 我的交换函数是用宏实现的,如下
- #define _SWAP_(x, y); \
-
do{ \
-
(x) = (x) + (y); \
-
(y) = (x) - (y); \
-
(x) = (x) - (y);
-
}while(0);
快速排序程序如下
- int quick_sort(Array *A)
-
{
-
int left = 0, right = 0, privot = 0;
-
-
left = 1;
-
right = A->last;
-
-
list_number(A);
-
q_sort(A, left, right);
-
-
return TRUE_;
-
}
-
-
void q_sort(Array *A, int left, int right)
-
{
-
int i = 0, j = 0;
-
int privot = 0;
-
-
list_number(A);
-
if (left < right) {
-
privot = A->elem[left].data;
-
i = left;
-
j = right+1;
-
do {
-
do {
-
i++;
-
} while (A->elem[i].data < privot);
-
do {
-
j--;
-
} while (A->elem[j].data > privot);
-
if (i < j) {
-
_SWAP_(A->elem[i].data, A->elem[j].data);
-
}
-
} while (i < j);
- _SWAP_(A->elem[left].data, A->elem[j].data); //在此处有一种情况是i == j
-
q_sort(A, left, j-1);
-
q_sort(A, j+1, right);
-
}
-
}
快速排序里,当两个子序排列完成后,应该交换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语言不允许这两个结构进行四则运算操作。
重新写一个交换宏
- #define _SWAP(x, y, Type);\
-
do{ \
-
Type temp; \
-
temp = x; \
-
x = y; \
-
y = temp; \
-
}while(0);
或者重新写一个交换函数解决上述问题
- int swap(int *a, int *b)
-
{
-
int temp = 0;
-
-
temp = *a;
-
*a = *b;
-
*b = temp;
-
-
return TRUE_;
-
}
阅读(2636) | 评论(2) | 转发(1) |