2013-03-05 77 views
0
# Sort an array a[0...n-1]. 
gaps = [701, 301, 132, 57, 23, 10, 4, 1] 

foreach (gap in gaps) 
    # Do an insertion sort for each gap size. 
    for (i = gap; i < n; i += 1) 
     temp = a[i] 
     for (j = i; j >= gap and a[j - gap] > temp; j -= gap) 
      a[j] = a[j - gap] 
     a[j] = temp 

這是Wikipedia頁面的僞代碼。 如果我的C++代碼根據它是正確的,我不確定。這裏是我的代碼:shell的僞代碼爲C++代碼

void shellSort(int *array, int array_size) 
{ 
    int e, i, j, temp; 
    for(e = 0; e < array_size; e++) 
    { 
     for(i = e; i < array_size; i++) 
     { 
      temp = array[i]; 
      for(j = i; j >= e && array[j - e] > temp; j -= e) 
      { 
      array[j] = array[j-e]; 
      } 
      array[j] = array[temp]; 
     } 

    } 
} 

這裏是我的測試代碼:

int main() 
{ 
    int sizes[9] = {9,3,5,7,1,0,6,2,4}; 
    int size = 0; 
    shellSort(sizes,size); 

    for(int i=0;i<size;i++) 
    { 
     cout << sizes[i] << endl; 
    } 

return 0; 

} 

,但它顯示在屏幕上什麼都沒有。

+0

那麼,它運行時,它與一些未分類的數據? – 2013-03-05 12:59:05

+0

通常在C++中,你只需調用'std :: sort'。 – juanchopanza 2013-03-05 13:01:08

+0

你似乎沒有使用'gaps []',你只是使用從0..n-1遞增的間隙('e')? – 2013-03-05 13:02:42

回答

2

好,讓藉此從頂部

void shellSort(int *array, int array_size) 
{ 

您的代碼完全省去所需的間隙陣列

const int gaps[] = {701, 301, 132, 57, 23, 10, 4, 1}; 
    int e, i, j, temp; 

外環必須橫跨間隙而不是0到ARRAY_SIZE

for(e = 0; e < sizeof(gaps)/sizeof(int); ++e) 
    { 
     int gap = gaps[e]; 

您需要使用內部環路中的間隙陣列的間隙

 for(i = gap; i < array_size; ++i) 
     { 
      temp = array[i]; 
      for(j = i; j >= gap && array[j - gap] > temp; j -= gap) 
      { 
      array[j] = array[j-gap]; 
      } 

你需要回到臨時存儲到數組

  array[j] = temp; 
     } 

    } 
} 

注:我沒有編譯器現在出手,所以我沒有檢查,但我認爲這是正確的。

另外,一些小的點,這樣的:

int e, i, j, temp; 

是不好的做法,而不是因爲你用它聲明每個變量,即做到這一點,而不是:

 for(int i = gap; i < array_size; ++i) 
     { 
      int temp = array[i]; 
+0

現在一切都很有意義,非常感謝 – Mustafa 2013-03-05 13:53:01

1

出於某種原因(無評論被給出),我的第一個答案被刪除(錯字 - 你設置大小爲0,而不是9)。這個問題想知道爲什麼「它在屏幕上什麼也沒有顯示」。如果將size設置爲0,那麼當循環從0迭代到<時,您希望循環執行哪些操作?

在查看算法之前,您的參數必須正確。從那裏開始。如果SOMETHING現在被轉儲到屏幕上,現在您可以開始調試算法(如果輸出錯誤)。如果輸出是正確的,那麼你的算法可能沒問題。

如果我對此有錯,請發表評論我的答案。不要只是「刪除」!!!