2009-04-19 68 views
1

我有一個n = 32的數組,具有正值和負值。第一個n/2元素是正數,按值排序,第二個n/2元素是負數,並按值排序。我想按整個數組排序整個數組,從最小的負值到最大的正值,這意味着如果有32個元素,前16個(n/2)排序元素應該包含原始數組的第16個元素的值而排序數組的第16個元素應該包含原始數組的前16個值。如何移動數組元素

假設的例子:

double[] original = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, -16, -15, ..., -1}; 

double[] sorted = {-16, -15, ...., -1, 1, 2, ..., 16}; 

有誰知道什麼是轉移的元素,以從原來的排序數組的最佳方式?

這個數組依賴於另一個數組,它沒有按照大小以相同方式排序的元素,並且必須以與原始數據相同的方式進行移位,所以數組不應該按大小排序,它必須移位

+0

爲什麼他們必須轉移,而不是排序? – 2009-04-19 18:44:26

+0

,因爲我不得不移動另一個未按大小排序的數組,這與我爲此所做的一樣。該示例代表一個x軸,它按大小排序,但另一個數組包含不應按大小排序的值(y軸)。 – 2009-04-19 18:54:16

+0

您是否想根據另一個數組中包含的值對一個數組進行排序?換句話說:你想排序一個數組,然後將相同的步驟序列應用到另一個數組? – 2009-04-19 19:06:44

回答

9

所以,你想第二陣列,與原來的內容,但在地點轉移?要麼做明確:

double[] result = new double[32]; 
for (int i=0; i < 32; i++) 
{ 
    result[(i+16)%32] = original[i]; 
} 

或使用Array.Copy兩次:

double[] result = new double[32]; 
Array.Copy(original, 0, result, 16, 16); 
Array.Copy(original, 16, result, 0, 16); 
0

只是做元素0和元素16,1和17,2和18上交換..等

0

你試過:

Array.Sort(original); 
2

如何在LINQ的:

int half = original.Length/2; 
var sorted = original.Skip(half).Concat(original.Take(half)).ToArray(); 
0

你想基於包含在另一個值一個數組排序相同大小的數組?如果是這樣,使用以下命令:

Array.Sort(keys, values); 

這裏的文檔Array.Sort(Array keys, Array items)

3

鑑於問題的剛性性質,Array.Copy

 int half = original.Length/2; 
     Array.Copy(original, 0, sorted, half, half); 
     Array.Copy(original, half, sorted, 0, half); 
0

喬恩斯基特的和Marc Gravell♦的答案提供正確的解決方案,但如果你不想分配額外的陣列,你可以:

a)解決你的具體問題(移動第二個一半在上半場之前)到位:

private void Rotate1(double[] toRotate) { 
     int startOf2nd = toRotate.Length/2; 
     for (int i=0; i < toRotate.Length/2; i++) { 
      double temp = toRotate [i]; 
      toRotate [i] = toRotate [i + startOf2nd]; 
      toRotate [i + startOf2nd] = temp; 
     } 
    } 

請注意,此代碼無法處理奇數個項目的數組。

b)您可以將矢量移算法我從喬恩Bentley的「編程珠璣」知道:

private void Rotate2(double[] toRotate, int index) { 
     Array.Reverse(toRotate, 0, index); 
     Array.Reverse(toRotate, index, toRotate.Length-index); 
     Array.Reverse(toRotate, 0, toRotate.Length); 
    } 

在你的榜樣,指數爲16,該代碼處理項目的奇數和指標不存在在中間。使用類似於本書中用於toRotate = {0,1,2,3,4,5,6,7}和索引= 3 Rotate2的示例將產生{3,4,5,6,7 0,1,2}。