2017-10-08 81 views
0

我一直在尋找所有的線程在這裏,似乎無法找到一個解決方案的工作。排序工作,但它比它應該是非常慢。下面是代碼(我工作了一個頭文件):我似乎無法弄清楚爲什麼我的合併排序如此緩慢

#pragma once 
#ifndef DataGen_h 
#define DataGen_h 

#include "RandomSupport.h" 

void merge(long list[], long start, long mid, long end) { 
    long i = start; 
    long j = mid + 1; 
    while (j <= end && i <= mid) { 
     if (list[i] < list[j]) { 
      i++; 
     } 
     else { 
      long temp = list[j]; 
      for (long k = j; k > i; k--) { 
      list[k] = list[k - 1]; 
      } 
      list[i] = temp; 
      mid++; 
      i++; 
      j++; 
     } 
    } 
} 

void merge_sort(long list[], long startIndex, long endIndex) 
{ 
    if (startIndex >= endIndex){ 
     return; 
    } 

    long midIndex = (startIndex + endIndex)/2; 
    merge_sort(list , startIndex, midIndex); 
    merge_sort(list, midIndex + 1, endIndex); 
    merge(list, startIndex, midIndex, endIndex); 
} 




void efficientRandomSortedList(long temp[], long s) { 
    // Get a new random device 
    randomizer device = new_randomizer(); 
    // Get a uniform distribution from 1 to 1000 
    uniform_distribution range = new_distribution(1, 45000); 

    for (long i = 0; i < s; i++) { 
     // At every cell of the array, insert a randomly selected number 
     // from distribution defined above 
     temp[i] = sample(range, device); 
    } 

    // Now sort the array using insertion_sort 

    merge_sort(temp, 0, s - 1); 
} 


#endif /* DataGen_h */ 

這是類,所以不幸的是我不能改變我的工作中的數據類型。任何幫助或一般批評我的格式會有所幫助。

+0

你可以包含一些性能數字嗎?請記住合併排序的平均性能爲'O(N * lgN)',所以如果你的代碼擴展到這個,那麼沒有什麼是錯的。 –

+3

你的'merge'是二次的,因爲你每次需要插入時移動'O(n)'元素的方式。這有點挫敗了整個觀點。 –

+0

*我一直在尋找所有的線程,似乎無法找到解決方案。* - 你沒有足夠努力。你看到[這個線程](https://stackoverflow.com/questions/24650626/how-to-implement-classic-sorting-algorithms-in-modern-c)? – PaulMcKenzie

回答

0

如果你要做merge這樣,你還不如做選擇排序;合併步驟都是二次的,而且你仍然在做對數數目的合併步驟。

就地mergesort是棘手的(而不是像mergesort一樣快)。您應該合併成一個臨時向量,然後將其複製回原始。或者在遞歸時避免通過在兩個向量之間交替進行復制。

+0

虐待給予一個嘗試,謝謝 –

+0

就地合併排序是棘手的,但如果不需要穩定性,它仍然可以有時間複雜度O(n日誌(n)),雖然比正常合併分類。示例java代碼顯示在[這個答案](https://stackoverflow.com/questions/46496692/algorithms-hybrid-mergesort-and-insertionsort-execution-time/46498454#46498454)的混合就地合併/插入排序。 – rcgldr

+0

@rcgldr:非常漂亮。 – rici

相關問題