Shell用C语言排序

时间:2014-09-03 16:28:09

标签: c arrays sorting shellsort

#include <stdio.h>

void ShellSort(int A[], int array_size) {

    int i, j, h, v;

    for(h = 1; h = array_size/9; h= 3*h + 1);
    for(; h > 0; h = h/3) {
        for(i=h+1;i=array_size;i++) {
            v=A[i];
            j=i;
            while(i > h && A[j-h] > v) {
                A[j] = A[j-h];
                j -= h;
            }
            A[j]=v;
        }
    }

    for(i = 0; i < 6; i++)   
        printf("%d", A[i]);
}

int main() {
    int i;
    int A[] = {6,1,4,3,2,5};  
    int size = 6;
    ShellSort(A,size);

    return 0;
}

使用C语言进行shell排序的问题。 它不会将数组打印为1 2 3 4 5 6,即它按原样打印数组。

1 个答案:

答案 0 :(得分:1)

只是给出要添加的printf,看看会发生什么:

#include<stdio.h>

void
ShellSort (int A[], int array_size)
{

  int i, j, h, v;

  for (h = 1; h = array_size / 9; h = 3 * h + 1);

  printf("init : h=%d\n", h);

  for (; h > 0; h = h / 3)
    {
      printf("loop : h=%d\n", h);

      for (i = h + 1; i = array_size; i++)
    {
      v = A[i];
      j = i;
      while (i > h && A[j - h] > v)
        {
          A[j] = A[j - h];
          j -= h;
        }
      A[j] = v;
    }
    }

  for (i = 0; i < 6; i++)
    printf ("%d ", A[i]);

}

int
main ()
{

  int i;
  int A[] = { 6, 1, 4, 3, 2, 5 };
  int size = 6;

  ShellSort (A, size);

  return 0;

}

=&GT;

init : h=0
6 1 4 3 2 5

它甚至没有进入排序循环。

那么什么是'h = array_size / 9'应该是一个循环测试并且是一种矫揉造作......

这是我认为你想要达到的版本:

#include<stdio.h>

void
ShellSort (int A[], int array_size)
{

  int gap, i, j, k, v;

  for (i = 1; i < array_size; i = 3 * i + 1)
    {
      gap=i;
    }

  printf("init : gap=%d\n", gap);

  for (; gap > 0; gap = gap / 3)
    {
      printf("loop : gap=%d\n", gap);

      for (i = gap; i < array_size; i++)
    {
      printf("inner loop : i=%d\n", gap);
      v = A[i];
      j = i;
      while (j >= gap && A[j - gap] > v)
        {
          printf("innermost loop : i=%d j=%d gap=%d \n", i,j,gap);
          A[j] = A[j - gap];
          printf("(%d.%d)", j, j - gap);
          j -= gap;

        }
      A[j] = v;
      for (k = 0; k < array_size; k++)
        printf ("%d ", A[k]);
      printf("\n");
    }
    }

  for (k = 0; k < array_size; k++)
    printf ("%d ", A[k]);

}

int
main ()
{

  int i;
  int A[] = { 9, 1, 4, 3, 2, 5, 7, 6, 8 };
  int size = sizeof(A) / sizeof(int);

  ShellSort (A, size);

  return 0;

}

最终结果是1 2 3 4 5 6 7 8 9如预期的那样。