2015-10-02 71 views
0

的一段代碼是:爲什麼在排序數組中需要臨時存儲?

if(a[i] > a[j]){ 
    temp = a[i]; 
    a[i] = a[j]; 
    a[j] = temp; 
} 

爲什麼一個臨時變量中使用?當我嘗試不溫:這是工作

if(a[i] > a[j]){ 
    a[i] = a[j]; 
} 

它不會工作,但在此之前,當我比較其他變量

+3

因爲你正在覆蓋'a [i]'的初始值,所以你不知道要分配什麼'a [j]' – clcto

+0

'a [i]'的舊值會發生什麼? –

回答

3

如果你沒有這個臨時變量

temp = a[i]; 
a[i] = a[j]; 
a[j] = temp; 

,那麼你將失去在a[i]值(先前的分配a[i] = a[j]

有交換價值,而無需方式。在使用時間值的解決方案是here

在C是這樣的:

int x = 10, y = 5; 
// Code to swap 'x' (1010) and 'y' (0101) 
x = x^y; // x now becomes 15 (1111) 
y = x^y; // y becomes 10 (1010) 
x = x^y; // x becomes 5 (0101) 

使用XOR運算符。代碼來自here,請轉到該鏈接以查找使用此解決方案的完整說明和可能的缺點。

+1

我知道有一種方法可以在沒有臨時變量的情況下交換它們,我只是太慢而無法找到它,哈哈。當我的選票回來時+1。 –

+1

謝謝,我從你的答案中學到新東西。 – Tim

+1

有多種原因不使用XOR交換。在現代架構中,XOR交換通常比使用臨時處理器慢,特別是流水線處理器。現代編譯器通常可以優化臨時(通過使用機器寄存器),並且使用連續XOR很難做到這一點,因爲每個語句的結果都取決於以前的結果。 – Peter

2

分配是單向操作。 a = b僅將b的值分配給a。分配完成後,a的原始值將丟失,因此無法將該值分配給b

2

聲明

a[i] = a[j] 

副本是什麼a[j]a[i]a[i]以前的內容丟失。

這就是爲什麼您需要保存以交換信息。

是一樣的,如果

int a = 1; 
int b = 2; 

b = a; // now contents of b is gone and cannot be assigned to a 
1

試試這個:

int main(void) { 
    int a = 2, b = 5, c = 7, d = 11, temp = 0; 

    /* a gets overwritten before it was swapped */ 
    a = b; // a is overwritten and becomes 5 (same value as b) 
    b = a; // b becomes 5 (same value as a, which is already same as b) 
    printf("%d %d", a, b); // this will print out 5 5 
    /* you can see that we lost value of a because it was overwritten */ 


    /* c gets stored in temporary value before it was stored */ 
    temp = c; // temp becomes 7 
    c = d;  // c is overwritten with 11 (same value as d 
    d = temp; // d is overwritten with 7 (same as temp or original c) 

    return 0; 
} 
2

賦值a = b副本b值到變量a。它不交換它們,丟失/丟棄原始值a

既然你不想失去原來的價值(這樣做意味着你沒有交換),在做任務時有必要在其他地方保存其中一個值。這是臨時變量的功能。

相關問題