2013-05-28 100 views
-2

我正在尋找最快的方式來訂購220000 * 7 * 6的多維向量。最快的方法來訂購一個巨大的矢量?

我按[x] [5] [y]排序,我必須使中間的所有值(7)矢量跟進。

for(int i =0;i<211876;i++){ 
    for(int k =0;k<211876;k++){ 
     if(vec[k][5][myposition] < vec[k+1][5][myposition]){ 
      for(int n =0;n<7;n++){ 
      swap2int(vec[k][n][myposition],vec[k+1][n][myposition]);} 
     } 
    } 
} 

void swap2int(int &one, int& two){ 
    int temp=0; 
    temp = one; 
    one = two; 
    two = temp; 

    return; 
} 

這是有點非常慢,我正在尋找方法來提高這個速度。

+3

請清理代碼。我沒有看到「我」在哪裏使用,並且在任何地方都沒有「myposition」的定義。它看起來像我只是簡單地對數組中的每個「行」進行排序,這應該可以通過標準排序來實現,也可以使用自定義迭代器類型。但沒有關於正在做什麼的細節,我們不能提供幫助。 –

+1

看起來像你已經實施了氣泡排序,這是非常緩慢的。看看這[流行的排序算法列表](http://en.wikipedia.org/wiki/Sorting_algorithm#Summaries_of_popular_sorting_algorithms)。基本上他們中的任何一個都會比你得到的更快。 – Kevin

+4

......除非你真的需要,自己編寫排序是重複的工作,你應該使用'',並使用std :: sort(http://www.cplusplus.com/reference/algorithm/sort/) – IdeaHat

回答

4

始終使用std::sort除非你有一個非常不好的理由。 std::sort允許您在必要時提供您自己的分類標準,因此幾乎沒有任何理由不使用它。你可能需要在你的情況下提供一個跨步迭代器,但這些很簡單。

+0

如果可能,std :: sort會執行O(N)類型的排序,還是要獲取O(nlog n)類型? –

0

你總是可以把它們放在一個小堆裏(從一個矢量創建一個最小(或最大)堆平均需要O(n)),然後,你可以簡單地從你的最小堆中以完美的順序提取數字,每個top()+ pop()操作的O(log n)成本。這樣,你會得到一個很好的O(N log N)成本,你會玩堆,這總是很有趣,並可能有更多的樂趣(並添加一些錯誤,這會讓你在這裏再次發佈)比如果你只是使用的std ::排序:P

或者你可以使用std ::排序之前的說道,忘記一切;)

順便說一句:在你swap2int()函數,就沒有必要浪費時間如果您不使用它,則將0分配給臨時值。只需將其更改爲:

int temp; temp = 1;

或直接到:

int temp = one;

相關問題