2011-09-02 47 views
1

是否有一種簡單的方法可以互相交換數組的各部分(塊)?也就是說,我有一個數組:在C++中相互交換數組的各個部分

array[0] = 1; 
array[1] = 2; 
array[2] = 3; 
array[3] = 4; 
array[4] = 5; 
array[5] = 6; 
array[6] = 7; 
array[7] = 8; 

和被叫swapSections(startX, endX, startY, endY)其幾乎給出這些值從我的示例交換出通過endX - startX與值從StartYendY的範圍內確定的值的範圍,所以功能。 ..

如果x range = 2startX = 0和和y range = 3startY = 5,它將使陣列[0]和陣列[1]到陣列[5]和數組[6]是,然後將數組[7]數組後[ 6],把其他所有東西都推下去。我不知道該如何解決這個問題,而且我正在將內存複製到臨時陣列,但我認爲有更好的方法來做到這一點。 (順便說一句,從我的例子中,最終結果將是):

array[0] = 6; 
array[1] = 7; 
array[2] = 8;  
array[3] = 3; 
array[4] = 4; 
array[5] = 5; 
array[6] = 1; 
array[7] = 2; 
+0

爲什麼不做你自己的功課,然後你可能會學到一些東西?這就是我想說的。 –

+0

@Ed我試着做我的功課,但沒有成功,所以我發佈。 – nyaan

+0

@nyaan請發佈您到目前爲止嘗試過的內容。 – balki

回答

1

你可能想看看valarray和它的切片。

+0

我不得不使用'int * array = new int []; ' – nyaan

+0

@downvoter - 原因? –

0

你可以在你的例子中採取的一種方法是交換最小範圍,然後「冒泡」最後一部分。所以:

array[0] = 1; --> 6 
array[1] = 2; --> 7 
array[2] = 3; 
array[3] = 4; 
array[4] = 5; 
array[5] = 6; --> 1 
array[6] = 7; --> 2 
array[7] = 8; 

然後,通過交換陣列氣泡了8 [7],與陣列[6],則數組[6]與陣列[5],等等,直到你把8在正確的地方。希望能讓你開始。

1

交換陣列的部分在可讀性和精力方面的最簡單方法是使用標準的C++函數swap_ranges()

#include <iostream> 
#include <algorithm> 
int main() 
{ 
    int a[8] = {1,2,3,4,5,6,7,8}; 

    std::cout << "Beforeswap: "; 
    for(int i=0; i<8; ++i) 
      std::cout << a[i] << ' '; 
    std::cout << '\n'; 

    std::swap_ranges(a+0, a+2, a+5); 

    std::cout << "After swap: "; 
    for(int i=0; i<8; ++i) 
      std::cout << a[i] << ' '; 
    std::cout << '\n'; 
} 

測試:https://ideone.com/ZVv2M

...但它只會掉子範圍長度相等,而不是測試用例中的不等長。您的案例實際上是swap_ranges()rotate()的組合。

0

假設您有(或可以創建)一個函數來反轉一系列元素,如reverse(array, start, end)。然後,您可以在四個步驟執行此任務:

// (1) reverse the first range 
array[0] = 2; 
array[1] = 1; 

// (2) reverse the elements between the ranges 
array[2] = 5; 
array[3] = 4; 
array[4] = 3; 

// (3) reverse the second range 
array[5] = 8; 
array[6] = 7; 
array[7] = 6; 

// (4) finally, reverse the entire array 
array[0] = 6; 
array[1] = 7; 
array[2] = 8; 
array[3] = 3; 
array[4] = 4; 
array[5] = 5; 
array[6] = 1; 
array[7] = 2; 

擾流板:(先做好功課,然後閱讀本)

如果你被允許使用標準庫在<algorithm>中有一個std::reverse函數,這使得這個微不足道。