簡體   English   中英

在 C 中,為什么將 x 與 y 交換比將 y 與 x 交換更快?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM