无法使用指针对没有临时变量的数组进行排序

标签 c arrays pointers

不使用 tmp 变量交换两个整数 xy 的值的算法是

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);
}    

输入:

2 4 3 5 8 7

预期输出:

2 3 4 5 7 8

获得的输出:

0 3 0 0 7 8

为什么会这样?我做错了什么?

最佳答案

The algorithm to swap the values of two integers x and y without using a tmp variable is

x = x + y;
y = x - y;
x = x - y;

这种方法的几个问题之一是当 xy 表达式引用相同的内存位置时它不起作用。这正是嵌套循环完成后某个项目就位时发生的情况,即当 im 相同时。

在进入交换之前添加 if (i == m) continue 将解决此问题。

Demo.

关于无法使用指针对没有临时变量的数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46180988/

相关文章:

c - 内联 asm 中不支持的指令 'mov' 将控制寄存器移动到 uint32_t

c - MinGW 编译器生成的二进制文件可以在没有 Mingw 的机器上运行吗?

php - 在 while 循环中使用 mysqli_fetch_array 时,PHP/MySQL 如何知道获取下一行?

ios - 在 Collection View 中删除项目的正确方法

C 指针和内存分配 : Realloc Arrays and Pointer Passing

c++ - 在 C 下通过引用传递指针参数?

c - 为什么 'c[&i]' 编译而 'c[i]' 不编译?

c - BIO_read 始终返回 0

c - 将函数中的 token (strtok)存储在主数组中

javascript - 对象的嵌套reduce函数