在不使用x
变量的情况下交换两个整数y
和tmp
的值的算法是
x = x + y;
y = x - y;
x = x - y;
我编写了一个代码,通过将数组传递给方法对数组进行排序。该方法接受指针*ptr
中的数组。因此,将使用指针变量arr[0], arr[1],...
访问数组*(ptr + 0), *(ptr + 1),...
的元素。但是,我面临的问题是,当我尝试通过使用指针引用内存位置进行排序时交换数组的值,而不使用临时变量,数组不会按照我的方式进行排序期待,相反,我看到一些随机元素被插入到数组中。
这是我的数组排序代码(选择排序 - 排序算法是正确的):
void sort(int *arr, int n){
int i,j,m;
for(i=0; i<n-1; i++){
m = i;
for(j=i+1; j<n; j++){
if(arr[j] < arr[m])
m = j;
}
//swapping arr[i] and arr[m]
*(arr + i) = *(arr + i) + *(arr + m);
*(arr + m) = *(arr + i) - *(arr + m);
*(arr + i) = *(arr + i) - *(arr + m);
}
//print the array...
}
void main(){
int arr[] = {2,4,3,5,8,7};
sort(arr, 6);
}
INPUT :
2 4 3 5 8 7
预期输出:
2 3 4 5 7 8
获得的输出:
0 3 0 0 7 8
为什么会这样?我做错了什么?
答案 0 :(得分:5)
在不使用tmp变量的情况下交换两个整数x和y的值的算法是
x = x + y; y = x - y; x = x - y;
此方法的几个问题之一是,当x
和y
表达式引用相同的内存位置时,它不起作用。这正是在完成嵌套循环后项目在其位置时发生的情况,即当i
与m
相同时。
在进入交换之前添加if (i == m) continue
将解决此问题。