这个交换功能有什么问题
what is wrong with this swap function
我正在查看未定义交换函数的快速排序程序,然后我尝试
自己定义。
#include <stdio.h>
#include <stdint.h>
void swap(int *x, int *y)
{
int tmp;
#if 1
*x = *x ^ *y;
*y = *y ^ *x;
*x = *x ^ *y;
#endif
#if 0
tmp = *x;
*x = *y;
*y = tmp;
#endif
}
int partiotion(int a[], int low, int high)
{
int i=low;
int pivot_key = a[low];
int j=high;
do
{
do { i++;} while (a[i] <= pivot_key);
do { j--;} while (a[j] > pivot_key);
if (i<j) swap(&a[i], &a[j]);
} while (i<j);
swap(&a[low], &a[j]);
return j;
}
void quick(int a[], int low, int high)
{
int j;
if (low<high)
{
j = partiotion(a, low, high);
quick(a, low, j);
quick(a, j+1, high);
}
}
int main()
{
int a[] = {1,3,9,8,7, INT32_MAX}, i;
quick(a, 0, 5);
for(i=0; i < 5; i++)
printf("%d\n", a[i]);
}
但是程序的输出结果是:
./a.out
0
0
0
0
9
如果我使用 tmp 变量(用于交换)它就可以正常工作,但是指针版本的交换有什么问题?
当您偶然调用 swap(&a[i], &a[i])
(具有相同的索引)时会出现问题。两个指针都指向同一个数组项。在第一个 XOR 之后,项目变为 0,无论它之前是什么。
我正在查看未定义交换函数的快速排序程序,然后我尝试 自己定义。
#include <stdio.h>
#include <stdint.h>
void swap(int *x, int *y)
{
int tmp;
#if 1
*x = *x ^ *y;
*y = *y ^ *x;
*x = *x ^ *y;
#endif
#if 0
tmp = *x;
*x = *y;
*y = tmp;
#endif
}
int partiotion(int a[], int low, int high)
{
int i=low;
int pivot_key = a[low];
int j=high;
do
{
do { i++;} while (a[i] <= pivot_key);
do { j--;} while (a[j] > pivot_key);
if (i<j) swap(&a[i], &a[j]);
} while (i<j);
swap(&a[low], &a[j]);
return j;
}
void quick(int a[], int low, int high)
{
int j;
if (low<high)
{
j = partiotion(a, low, high);
quick(a, low, j);
quick(a, j+1, high);
}
}
int main()
{
int a[] = {1,3,9,8,7, INT32_MAX}, i;
quick(a, 0, 5);
for(i=0; i < 5; i++)
printf("%d\n", a[i]);
}
但是程序的输出结果是:
./a.out
0
0
0
0
9
如果我使用 tmp 变量(用于交换)它就可以正常工作,但是指针版本的交换有什么问题?
当您偶然调用 swap(&a[i], &a[i])
(具有相同的索引)时会出现问题。两个指针都指向同一个数组项。在第一个 XOR 之后,项目变为 0,无论它之前是什么。