直接插入排序、折半排序、希尔排序
代码如下:
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define INITLISTSIZE 20
typedef int ElemType;
typedef struct //定义
{
ElemType *elem;
int length;
int listsize;
}seqlist;
int initlist(seqlist *L) //初始化
{
L->elem=(ElemType *)malloc(sizeof(ElemType)*INITLISTSIZE);
L->length=0;
L->listsize=INITLISTSIZE;
}
int fuzhi(seqlist *L) //为顺序表赋值
{
int i,magic,n;
printf("自动函数赋值\n");
printf("请输入顺序表的长度:");
scanf("%d",&L->length);
for(i=1;i<=L->length;i++)
{
magic=rand()%100+1;
L->elem[i]=magic;
}
return OK;
}
int print(seqlist *L) //打印顺序表
{
int i;
printf("此时顺序表的长度为%d\n",L->length);
printf("此时顺序表的存储空间为%d\n",L->listsize);
printf("顺序表的元素如下:\n");
for(i=1;i<=L->length;i++)
{
printf("%5d",L->elem[i]);
}
printf("\n");
}
int initsort(seqlist *L) //直接插入排序
{
int i,j;
for(i=2;i<=L->length;i++)
{
if(L->elem[i]<L->elem[i-1])
{
L->elem[0]=L->elem[i];
for(j=i-1;L->elem[j]>L->elem[0];j--)
L->elem[j+1]=L->elem[j];
L->elem[j+1]=L->elem[0];
}
}
return OK;
}
int Binsort(seqlist *L) //折半插入排序
{
int i,j,low,high,middle;
for(i=2;i<=L->length;i++)
{
if(L->elem[i]<L->elem[i-1])
{
L->elem[0]=L->elem[i];
low=1;
high=i-1;
while(low<=high)
{
middle=(low+high)/2;
if(L->elem[middle]>L->elem[0])
high=middle-1;
else
low=middle+1;
}
for(j=high+1;j<=i-1;j++)
L->elem[j+1]=L->elem[j];
L->elem[high+1]=L->elem[0];
}
}
return OK;
}
int shell(seqlist *L) //希尔排序
{
int i,j,d;
for(d=L->length/2;d>=1;d=d/2)
{
for(i=d+1;i<=L->length;i++)
{
if(L->elem[i-d]>L->elem[i])
L->elem[0]=L->elem[i];
for(j=i-d;j>0&&L->elem[j]>L->elem[0];j=j-d)
L->elem[j+d]=L->elem[j];
L->elem[j+1]=L->elem[0];
}
}
}
int menu() //菜单
{
int i;
printf("===============排序===============\n");
printf("===========1.顺序表的初始化=======\n");
printf("===========2.顺序表的赋值=========\n");
printf("===========3.直接插入排序=========\n");
printf("===========4.折半排序法===========\n");
printf("===========5.希尔排序法===========\n");
printf("===========6.打印顺序表===========\n");
printf("===========7.结束程序=============\n");
printf("请输入您的选择\n");
scanf("%d",&i);
return i;
}
int main()
{
int n,a;
seqlist *L;
while(1)
{
n=menu();
switch(n)
{
case 1:system("cls");
initlist(&L);
printf("初始化成功\n");
break;
case 2:system("cls");
fuzhi(&L);
break;
case 3:system("cls");
initsort(&L);
printf("排序成功\n");
break;
case 4:system("cls");
Binsort(&L);
printf("排序成功\n");
break;
case 5:system("cls");
shell(&L);
printf("排序成功\n");
break;
case 6:system("cls");
print(&L);
break;
case 7:printf("程序运行结束!");
exit(0);
}
}
}