回 帖 发 新 帖 刷新版面

主题:用希尔算法遇到麻烦,帮忙看看,谢谢了!

#include<stdio.h>
#define MAXSIZE 10
typedef int KeyType;
typedef struct
{
  KeyType key;
}RecType;
typedef struct
{
  RecType r[MAXSIZE+1]; 
  int length;
}Sortlist;

main()
{
  Sortlist S;
  int x,i=1;
  S.length=0;
  printf("please input numbers(int),space out by 'space',exit for '0':\n");
  scanf("%d",&x);
  while(x!=0&&i<MAXSIZE+1)
  {
    S.r[i].key=x;
    S.length++;
    i++;
    scanf("%d",&x);
  }
  printf("\n");
  printf("---------------------------\n");
  printf("1--Direct Sort\n");
  printf("2--Shell Sort\n");
  printf("3--Quick Sort\n");
  printf("4--Selection Sort\n");
  printf("5--Stack Sort\n");
  printf("6--Two Path Sort\n");
  printf("---------------------------\n");
  printf("\n");
  printf("The numbers are:");
  for(i=1;i<=S.length;i++)
  {
    printf("%4d",S.r[i].key);
  }
  printf("\n");
  printf("length=%d",S.length);
  printf("\n");
  directsort(S);
  shellsort(S);
  getch();
}

directsort(Sortlist L)
{
  /* 直接插入排序 */
  int i,j;
  for(i=2;i<=L.length;i++)
  {
    L.r[0]=L.r[i];                          /* 第i个数存入监视哨 */
    for(j=i-1;L.r[0].key<L.r[j].key;j--)    /* 与前面的第i-1个数比较,如果比前面的数小则关键字大的向后移 */
      L.r[j+1]=L.r[j];
    L.r[j+1]=L.r[0];                        /* 如果比前面数大,则直接存入第j+1个位置 */
  }
  printf("Direct Sort--");
  rearsort(L);
}

shellsort(Sortlist L)
{
  /* 希尔排序 */
  int i,k;
  printf("\n");
  k=L.length/2;
  for(;k>0;)
  {
    for(i=1;i<=L.length-k;i++)
    {
      if(L.r[i].key>L.r[i+k].key)
      {
        L.r[0]=L.r[i];
        L.r[i]=L.r[i+k];
        L.r[i+k]=L.r[0];
      }
    }
    k=k/2;
  }
  printf("Shell Sort--");
  rearsort(L);
}
  
rearsort(Sortlist L)
{
  int i;
  printf("The Sort is:");
  for(i=1;i<=L.length;i++)
  {
    printf("%3d",L.r[i].key);
  }
}

在希尔排序部分,为什么排不出来啊,理论上都是正确的!
比如输入9 8 7 6 5 4 3 2 1 0
希尔部分就把1,2个数没排好!
问题在哪里啊,我觉得这个希尔部分的程序思路没问题啊!

回复列表 (共2个回复)

沙发

[quote]    for(i=1;i<=L.length-k;i++)
    {
      if(L.r[i].key>L.r[i+k].key)
      {
        L.r[0]=L.r[i];
        L.r[i]=L.r[i+k];
        L.r[i+k]=L.r[0];
      }
    }
[/quote]
什么叫理论上正确啊?你这根本就不是Shell排序,Shell排序过程中用的是插入排序,你在上面的循环中却使用交换法。而且交换过程也是错误的。建议再仔细看看书

板凳

我对希尔排序理解是正确的,那就是我写的这段程序是错误的吧~~~
我再看看,不过麻烦后楼的能解决的还是帮忙回答一下,谢谢!

我来回复

您尚未登录,请登录后再回复。点此登录或注册