C语言实现表插入排序

表插入排序
  1. 实现思想
    • 使用链表的存储结构对数据进行插入排序。在对记录按照其关键字进行排序的过程中,不需要移动记录的存储位置,只需要更改结点间指针的指向。
    • 在使用数组结构表示的链表中,设定数组下标为 0 的结点作为链表的表头结点,并令其关键字取最大整数。
    • 具体实现过程是:首先将链表中数组下标为 1 的结点和表头结点构成一个循环链表,然后将后序的所有结点按照其存储的关键字的大小,依次插入到循环链表中。
  2. 时间复杂度
    • 最好情况:O(n)
    • 最坏情况:O(n²)
    • 平均时间复杂度:O(n²)
  3. 空间复杂度
    • O(n)
  4. 稳定性
    • 稳定
代码
	#include<stdio.h>
	#include<limits.h>
	
	#define MaxSize 5
	
	typedef struct{
		int key;
		int next;
	}Rcd;
	
	typedef struct{
		Rcd r[MaxSize+1];
		int length;
	}List; //静态链表
	
	//初始化静态链表
	void InitList(List *L,int s[],int n){
		int i;
		(*L).r[0].key=INT_MAX;
		(*L).r[0].next=0;
		(*L).length=5;
		for(i=1;i<=n;i++){
			(*L).r[i].key=s[i-1];
			(*L).r[i].next=-1;
		}
	}
	
	//对记录进行排序
	void arrange(List *L){
		int i,p,q;
		Rcd tmp;
		p=(*L).r[0].next;
		for(i=1;i<=(*L).length;i++){
			while(p<i)
				p=(*L).r[p].next;
			q=(*L).r[p].next;
			if(p!=i){
				tmp=(*L).r[i];
				(*L).r[i]=(*L).r[p];
				(*L).r[p]=tmp;
				(*L).r[i].next=p;
			}
			p=q;
		}
	}
	
	//表插入排序
	void TInsertSort(List *L){
		int i,j,k;
		for(i=1;i<=(*L).length;i++){   //对指针进行排序
			for(k=0,j=(*L).r[k].next;(*L).r[j].key<(*L).r[i].key;k=j,j=(*L).r[k].next);
			(*L).r[i].next=j;
			(*L).r[k].next=i;
		}
		arrange(L);  //对记录进行排序,方便以后进行折半查找
	}
	
	//遍历静态链表中的key值
	void Traverse(List L){
		int i;
		for(i=1; i<=L.length; i++){
			printf("%d ",L.r[i].key);
		}
		printf("\n");
	}
	
	void main(){
		List L;
		int n=5,s[5]={49,38,76,13,27};
		InitList(&L,s,n); //要传指针,因为要对L中元素进行修改
		TInsertSort(&L);  //要传指针,因为要对L中元素进行修改
		printf("排序后的结果为:\n");
		Traverse(L);
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值