论坛: 编程破解 标题: 希尔排序问题 复制本贴地址    
作者: sniper167 [sniper167]    论坛用户   登录
看了希尔排序的思路后,自己写了个,但是不行
输入 9 8 7 6 5 4 3 2 1 0
排序后是9 9 9 9 9 9 9 9 9 9
请看看
----------------------------------------------------------
main()
{int arr[10],d[3];
int  temp,i,j,k;
d[0]=5;
d[1]=3;
d[2]=1;
for (i=0;i<10;i++)
    scanf ("%d",&arr[i]);
for (i=0;i<3;i++)
    for (j=0;j<d[i];j++)
        for (k=j+d[i];k<10;k+=d[i])
            {temp=arr[k];
            while (j>=0&&arr[k]<arr[j])
                {arr[k]=arr[j];j-=d[i];}
            arr[j]=temp;
            }
for (i=0;i<10;i++)
    printf("%5d",arr[i]);
getch();
}

地主 发表时间: 04-05-03 15:21

回复: lida1818 [lida1818]   论坛用户   登录
不知道我这个是不是sehll排序,大概是这样吧。


main()
{
int arr[10];
int  temp,i,j;


for (i=0;i<10;i++)
    scanf ("%d",&arr[i]);

for (i=5;i>=0;i-=2)
    for (j=0;j<10-i;j++)
        {
            temp=arr[j];
            if (arr[j]>arr[j+i])
            {
            arr[j]=arr[j+i];
            arr[j+i]=temp;
            }
        }
for (i=0;i<10;i++)
    printf("%5d",arr[i]);
getch();
}

B1层 发表时间: 04-05-03 17:33

回复: sniper167 [sniper167]   论坛用户   登录
#include <stdio.h>
#include <conio.h>

void main()
{int arr[10],d[3];
int  temp,i,j,k,l;
d[0]=5;
d[1]=3;
d[2]=1;
for (i=0;i<10;i++)
    scanf ("%d",&arr[i]);
for (i=0;i<3;i++)
    for (j=0;j<d[i];j++)
for (k=j+d[i];k<10;k+=d[i])
    {temp=arr[k];
    l=k-d[i];  //因为j是循环变量,不应该在循环体内改变它的值,用L代替
    while (l>=0&&arr[l]>temp)  //你的是(j>=0&&arr[k]<arr[j]),每次复制的都是arr[k]<的值,所以输出的都是9
{arr[l+d[i]]=arr[l];l-=d[i];} 
    arr[l+d[i]]=temp;
    }
for (i=0;i<10;i++)
    printf("%5d",arr[i]);
printf("\n");
getch();
}


B2层 发表时间: 04-05-03 22:06

回复: morrel [morrel]   论坛用户   登录
typedef struct data{
int length;
int r[10];
}date;
date L;
  shellsort()
      { int i,j,d;
  d=(L.length/2);
    while (d>0)
    {  for (i=d+1;i<=L.length;++i)
    if (L.r[i]<L.r[i-d])
    { L.r[0]=L.r[i];
    for(j=i-d;j>0&&L.r[0]<L.r[j];j-=d)
    L.r[j+d]=L.r[j];
    L.r[j+d]=L.r[0];  }
    d=d/2;
    }
    }



quicksort(int low,int high)
{  int i,j;
  if (low<high)
  {  i=low; j=high; L.r[0]=L.r[i];
  do {  while (i<j &&L.r[j]>L.r[0])  --j;
  if (i<j)    {L.r[i]=L.r[j];  ++i; }
  while (i<j &&L.r[i]<=L.r[0])  ++i;
  if (i<j)    {L.r[j]=L.r[i];  --j; }
  } while (i!=j);
  L.r[i]=L.r[0];
  quicksort(low,i-1);
  quicksort(i+1,high);
}
  }


heapadjust(int s,int m)
{int rc,j;
rc=L.r[s];
for(j=2*s;j<=m;j*=2)
{if(j<m&&L.r[j]<L.r[j+1])j++;
if(rc>=L.r[j])break;
L.r[s]=L.r[j];s=j;
}
L.r[s]=rc;
}

heapsort()
{int i,t;
for(i=L.length/2;i>0;--i)
heapadjust(i,L.length);
for(i=L.length;i>1;--i)
{t=L.r[1];L.r[1]=L.r[i];L.r[i]=t;
heapadjust(1,i-1);
}
}


main()
{int i,c;
printf("\nPlease input length numbers:");
scanf("%d",&L.length);
for(i=1;i<=L.length;i++)
scanf("%d",&L.r[i]);
printf("\nplease choose the method of partion:\n");
scanf("%d",&c);
switch(c)
{case 1:shellsort( );break;
case 2:quicksort(1,L.length);break;
case 3:heapsort();break;
default:printf("Input ERROR!\n");}
for(i=1;i<=L.length;i++)
printf("%d ",L.r[i]);}



B3层 发表时间: 04-05-28 17:51

论坛: 编程破解

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号