希尔排序问题

来源:互联网 发布:建立数据库的表结构 编辑:程序博客网 时间:2024/06/06 18:27

希尔排序是在直接插入排序的基础上进行的,先进行分组有序然后逐渐减小组成员间的位序差值,当为序差为一时即和直接插入排序完全相同。

 

程序执行结果截图如下:

 

截图一:

 

截图二:

 

程序的源代码如下:

 

#include<stdio.h>

 

 

typedefstruct{

int *p;

int length;

}sqlist;

void initshellarr(sqlist &L,int arr[])

{

   intelemnumber=0;

   printf("请输入数组中的第一个元素,输入110结束\n");

   int elem;

   scanf("%d",&elem);

   int i;

   for(i=1;elem!=110;i++)

   {

     arr[i]=elem;

     printf("请输入数组中的下一个元素,输入110结束\n");

     scanf("%d",&elem);

   }

   L.p=arr;

   L.length=i-1;

 

}

 

 

bool lt(int i,int j)

{

   if(i<j)

   return true;

   else

   return false;

 

}

 

 

 

 

void shellinsert(sqlist &L,int arr[],int dk)

{

   for(int i=dk+1;i<=L.length;i++)// xun huan ge zu

   {

       for(int ij=i;ij<=L.length ;ij+=dk)//dui其中一组进行排序

       {

         if(lt(L.p[ij],L.p[ij-dk]))

        {

           L.p[0]=L.p[ij];

           //L.p[ij]=L.p[ij-dk];

           intj;

           for(j=ij-dk;j>0&&lt(L.p[0],L.p[j]);j-=dk)

           {

               L.p[j+dk]=L.p[j];

           }

           L.p[j+dk]=L.p[0];

         }

       }

   }

   

}

void shellsorting(sqlist &L,int arr[])

{

   intdata[3]={5,3,1};   

   int t=3;

   for(int k =0;k<t;k++)

   {

     shellinsert(L,arr,data[k]);

   }

}

 

void showarr(sqlist &L)

{

   for(int i=1;i<=L.length;i++)

       {

           printf("%d",L.p[i]);

           printf("\t");

       }

   printf("\n");

}

 

void main()

{

   sqlist L;

   intshellarr[200];

   initshellarr(L,shellarr);

   printf("希尔排序之前\n");

   showarr(L);

   L.p=shellarr;

   shellsorting(L,shellarr);

   L.p=shellarr;

   printf("希尔排序之后\n");

   showarr(L);

}