主题:用希尔算法遇到麻烦,帮忙看看,谢谢了!
#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个数没排好!
问题在哪里啊,我觉得这个希尔部分的程序思路没问题啊!
#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个数没排好!
问题在哪里啊,我觉得这个希尔部分的程序思路没问题啊!