[英]In C, why swapping x with y is faster then swapping y with x?
在一个minimum- swaps -2 问题中,arr 是未排序的数组,arr_count 是数组元素的数量,我们需要返回最小交换次数来对数组进行排序,
我试过:
int minimumSwaps(int arr_count, int* arr) {
int swap = 0;
for(int i = 0; i < arr_count;){
if(arr[i] != (i + 1)){
int temp = arr[i];
arr[i] = arr[arr[i] - 1];
arr[arr[i] - 1] = temp;
swap++;
} else {
i++;
}
}
return swap;
}
但它没有用。 它显示超时错误。 即运行需要更多时间! 然后我尝试了下面的代码,它奏效了!
int temp = arr[arr[i] - 1];
arr[arr[i] - 1] = arr[i];
arr[i] = temp;
swap++;
两者之间的唯一区别是将 x 与 y 或 y 与 x 交换。 它有什么区别?
在arr[i] = arr[arr[i] - 1];
值arr[i]
已更改并且arr[arr[i] - 1]
不再指向相同的存储, arr[arr[i] - 1] = temp;
写入错误的存储。
所以你实际上不会交换两个值。 如果您将其表示为指针算术,则可能很明显。
int temp = *(arr + i);
*(arr + i) = *(arr + temp - 1);
*(arr + *(arr + i) - 1) = temp;
最后一行等于*(arr + *(arr + temp - 1) - 1)
值出现在第 2 行执行之前,根据任务的定义这是错误的。
事实上,它给出了明显的解决方案:
int temp = *(arr + i);
*(arr + i) = *(arr + temp - 1);
*(arr + temp - 1) = temp;
或者
int temp = arr[i];
arr[i] = arr[temp - 1];
arr[temp - 1] = temp;
这产生从minimumSwaps
返回的结果 5 。
基本上你超时是因为第一个变体无法达成解决方案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.