C语言直接插入排序和折半插入排序算法的实现

直接插入排序是是一种稳定的排序,其算法简便,适用于顺序结构和链式结构,更适合于基本有序(正序)的情况。其空间复杂度为O(1),时间复杂度为O(n2)。下面是实现算法:

先是预定义和类型定义:

typedef int Status;
typedef int ElemType;

typedef struct{
	ElemType *data;
	int length;
}SqList;

创建链表:

Status EnSqList(SqList *L, ElemType e, int n)
{
	L->data[n + 1] = e;
	L->length++;
	return OK;
}

直接插入排序:

void InsertSort(SqList *L)
{
	int i, j;
	for (i = 2; i <= L->length; i++)
	{
		if (L->data[i] < L->data[i - 1])
		{
			L->data[0] = L->data[i];
			L->data[i] = L->data[i - 1];
			for (j = i - 2; L->data[j]>L->data[0]; j--)
				L->data[j + 1] = L->data[j];
			L->data[j + 1] = L->data[0];
		}
	}
}

先让i等于2(只有一个元素的话没有必要排序),判断i下标的值是否比它前一个值要小,若是,则将i下标的值保存在下标为0的元素中,并让前一位元素后移一位(移动到i的位置)。之后利用循环判断之前的值是否比0号元素大,若是,则后移,直到遇到元素比0号元素小的,则将0号元素保存在比它小元素的下一个节点。

加入main():


int main(void)
{
	SqList L;
	ElemType e;
	int i, n;
	L.data = (int *)malloc(sizeof(int)*MVNum);
	L.length = 0;
	printf("输入元素个数:");
	scanf("%d", &n);
	printf("输入各个元素:");
	for (i = 1; i <= n; i++)
	{
		scanf("%d", &e);
		EnSqList(&L, e, L.length);
	}
	InsertSort(&L);
	for (i = 1; i <= L.length; i++)
		printf("%d ", L.data[i]);
	printf("\n");
	return 0;
}

折半插入排序也是一种稳定的排序,不可作用于链式储存结构,适合用于初始值无序,且n值比较大的情况。其空间复杂度为O(1),时间复杂度为O(n2)。下面是实现代码:

首先预定义和类型定义:

#define OK 1
#define ERROR 0
typedef int Status;
typedef int ElemType;

typedef struct{
	ElemType *data;
	int length;
}SqList;

创建链表:

Status EnSqList(SqList *L,ElemType e,int n)
{
	if (L->length >= n)
		return ERROR;
	L->data[L->length + 1] = e;
	L->length++;
	return OK;
}

折半插入排序算法:

void BInsertSort(SqList *L)
{
	int i, j, mid, high, low;
	for (i = 2; i <= L->length; i++)
	{
		low = 1;
		high = i - 1;
		L->data[0] = L->data[i];
		while (low <= high)
		{
			mid = (low + high) / 2;
			if (L->data[0] < L->data[mid])
				high = mid - 1;
			else
				low = mid + 1;
		}
		for (j = i - 1; j >= high + 1; j--)
			L->data[j + 1] = L->data[j];
		L->data[high + 1] = L->data[0];
	}
}

从下标为2的元素开始(只有一个元素的话根本就没必要排序),让下标为0的元素储存下标为i元素的值,并初始化low为1,high为i-1。当low小于或等于high的时候,未确定插入位置,由于i之前的元素肯定有序,则利用折半的方法确定插入位置。让后将下标等于high之前的元素值都后移一位。让后将下标为0的元素(原来要排序的元素)插入到下标为high+1的位置。

加入main():

int main(void)
{
	SqList L;
	int n, i;
	ElemType e;
	L.length = 0;
	printf("输入元素个数:");
	scanf("%d", &n);
	L.data = (int *)malloc(sizeof(int)*n);
	printf("输入各个元素的值:");
	for (i = 0; i < n; i++)
	{
		scanf("%d", &e);
		EnSqList(&L, e, n);
	}
	BInsertSort(&L);
	for (i = 1; i <= n; i++)
		printf("%d ", L.data[i]);
	printf("\n");
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值