每天一个小程序(10)——直接插入排序

插入排序的基本思想:

       有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外,而第二部分就只包含这一个元素。在第一部分排序后,再把这个最后元素插入到此刻已是有序的第一部分里的位置

       算法是这样的,数组的第0位为保存带记录的R[i]的值,以免在移动中被覆盖而丢失。从第2位开始将元素暂存在R[0]中,从第2位前面开始比较,若R[0]小于R[1],将R[1]后移到R[2]中,位置标记j 前移,直到没有比R[0]大的值后,将R[0]放到R[j+1]中,这样就完成了一趟比较,R[1]和R[2]为有序的,接下来i++,进行下一趟排序。

首先是顺序表排序

//顺序表插入排序
void ins_sort(datatype1 R[],int n)
{
	int i,j;
	for(i = 2; i <= n; i++)
	{
		R[0] = R[i];
		j = i - 1;
		while(R[0].key < R[j].key)//比较R[0]和j值
		{
			R[j+1] = R[j];//若小于,则j值后移
			j--;
		}
		R[j+1] = R[0];
	}
}

链表插入排序,链表函数参考双链表,传送门双向链表

//链表插入排序
void ins_sort2(DuLinkList L)
{
	DuLinkList p = L->next->next;
	datatype data;
	DuLinkList q;
	while(p != L)
	{		
		data = p->data;
		q = p->prior;
		while(data < q->data)
		{
			q->next->data = q->data;
			q = q->prior;
		}
		q->next->data = data;
		p = p->next;
	}
}


算法分析

稳定性:稳定的

时间复杂度:O(n^2)

最快的情况:正序

最慢的情况:逆序

趟数为n-1趟



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值