一、插入排序法:直插+折半+希尔(C语言源代码)

本文介绍了三种插入排序算法的C语言实现,包括直接插入排序、折半插入排序和希尔排序。通过代码详细展示了如何在顺序表结构中进行排序操作,适用于理解数据结构与算法的初学者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/***************************************************/
/*    Description:一、插入排序法:直插+折半+希尔(C语言源代码)
/*    Date:2021/9/7
/*    Author:汝南城
/****************************************************/
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 1000

/*插入排序算法基于的顺序表存储结构*/
typedef int KeyType;
typedef struct{
	KeyType key;
	char name[10];//other info
}RedType;

typedef struct {
	RedType r[MAXSIZE + 1];
	int length;
}SqList;

/*①直接插入排序法:从后到前一个一个依次比较*/
void Direct_Insert_Sort(SqList* L)
{
	int i,j;
	for (i = 2; i <= L->length; i++)
	{
		if (L->r[i].key < L->r[i - 1].key)
		{
			L->r[0] = L->r[i];        /*比较,设置哨兵*/
			for (j = i - 1;L->r[0].key < L->r[j].key; j--)
			{
				L->r[j + 1] = L->r[j];    /*比较,后移*/
			}
			L->r[j + 1] = L->r[0];
		}
		
	}
}

/*②折半插入排序:用折半查找算法找到插入的位置*/
void Bin_Sert_Sort(SqList* L)
{
	int i;
	for (i = 2; i <= L->length; ++i)
	{
		L->r[0] = L->r[i];
		int low = 1, high = i - 1;
		while (low <= high)
		{
			int mid = (low + high) / 2;
			if (L->r[0].key < L->r[mid].key)
			{
				high = mid - 1;
			}
			else
			{
				low = mid + 1;
			}
		}
		for (int j = i - 1; j >= high + 1; --j)
		{
			L->r[j + 1] = L->r[j];
		}
		L->r[high + 1] = L->r[0];
	}
}

/*③希尔排序法(单次)*/
void Shell_Insert(SqList* L,int dk)
{
	int i,j;
	for (i = dk + 1; i <= L->length; i += dk)
	{
		if (L->r[i].key < L->r[i - dk].key)
		{
			L->r[0] = L->r[i];
			for (j = i - dk; j > 0 && (L->r[0].key < L->r[j].key); j -= dk)
			{
				L->r[j + dk] = L->r[j];
			}
			L->r[j + dk] = L->r[0];
		}
	}
}

/*④希尔排序法(多次)*/
void Shell_Sort(SqList* L,int t,int dt[])
{
	int k;
	for (k = 0; k < t; k++)
	{
		Shell_Insert(L,dt[k]);
	}
}

void main()
{
	SqList* L1 = (SqList*)malloc(sizeof(SqList));

	RedType i;
	L1->length = 0;
	for (i.key = 100; i.key > 90; i.key--)
	{
		L1->r[101 - i.key].key = i.key;
		L1->length++;
	}

	for (int j = 1; j <= 10; j++)
	{
		printf("%d ",L1->r[j].key);
	}
	printf("\n");


	/*①直接插入排序法:从后到前一个一个依次比较*/
	//Direct_Insert_Sort(L1);

	/*②折半插入排序*/
	//Bin_Sert_Sort(L1);


	/*③希尔排序法(单次)*/
	/*Shell_Insert(L1,2);
	for (int j = 1; j <= 10; j++)
	{
		printf("%d ", L1->r[j].key);
	}
	printf("\n");

	Shell_Insert(L1,1);
	for (int j = 1; j <= 10; j++)
	{
		printf("%d ", L1->r[j].key);
	}*/

	/*④希尔排序法(多次)*/
	int shelldt[2] = { 1,2 };
	Shell_Sort(L1, 2, shelldt);
	for (int j = 1; j <= 10; j++)
	{
		printf("%d ", L1->r[j].key);
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值