数据结构--直接插入排序、折半排序、希尔排序

该博客展示了如何使用C语言实现三种不同的排序算法:直接插入排序、折半插入排序和希尔排序。通过初始化顺序表、赋值、打印及排序等操作,详细阐述了每种排序方法的步骤和逻辑。读者可以学习到如何在实际编程中应用这些基础排序算法。
摘要由CSDN通过智能技术生成

直接插入排序、折半排序、希尔排序

代码如下:

#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);
		}
	}
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大菜彩

家人们鼓励鼓励!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值