2013-03-05 139 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现在被转储到屏幕上,现在您可以开始调试算法(如果输出错误)。如果输出是正确的,那么你的算法可能没问题。

如果我对此有错,请发表评论我的答案。不要只是“删除”!!!