排序算法—直接插入排序

直接插入排序

插入排序是每次将一个数据按大小插入到有序区的合适位置,直到所有数据都插入到有序区。

题目描述

给出一组数据,根据由小到大顺序输出。

输入要求:

输入一个整数n(数据长度)
输入n个数据

输出要求:

输出由小到大排序后的数据

样例输入:

10
37 28 46 19 55 28 92 84 63 71

样例输出:

19 28 28 37 46 55 63 71 84 92

基本思想

假设待排序的数据都存放在数组R[n]中,将R划分为两个子区间{R[0],R[i-1]}和{R[ i ],R[n-1]},其中前一个子区间是已经排好的有序区;后一个子区间是未排序的无序区。把无序区的第1个数据R[i]插入到有序区的适当位置,使得R[0]到R[i]变为新的有序区。
这个过程中我们需要解决的关键问题是,如何将R[i]插入到有序区中的合适位置保证插入后仍然有序。最简单有效的方法是,查找插入位置和数据移动交替进行,即R[ i ]依次与前面数据R[ j ](j=i-1,i-2…)比较,比R[ i ]大的数据顺次后移,当R[ j ]<=R[ i ]时,查找结束,j+1的位置就是R[ i ]的插入位置。
在这里插入图片描述

参考代码(C语言)
#include<stdio.h>
void insert_sort(int R[],int n); //直接插入排序

int main()
{
	int i,R[100],n;
	scanf("%d",&n);
	for(i=0;i<n;i++)
	scanf("%d",&R[i]);
	insert_sort(R,n);
	return 0;
} 

void insert_sort(int R[],int n)
{
	int i,j,k;
	for(i=1;i<n;i++)
	{
		k=R[i];
		for(j=i-1;k<R[j]&&j>=0;j--) //R[j]<=R[i]或已经是第一个位置时,j+1为插入位置 
			R[j+1]=R[j];     //R[j]>R[i]时R[j]后移一个位置 
		R[j+1]=k; 	//R[i]插入R[j+i]位置 
	}
	for(i=0;i<n;i++)
	printf("%d ",R[i]);
} 
分析总结

平均时间复杂度O( n 2 n^2 n2)
空间复杂度S( n n n)=O(1)
直接插入排序是稳定的排序方法。

写在最后

代码的表达形式多种多样,重点是理解排序的思想和过程,附上一个网上看到的动画,可以帮助理解排序过程☞链接在此(个人觉得如果有一些基础的看本文上面给的图示去理解最好,更有助于建立编程的思维,视频能相对有些趣味性)
说明: 链接内视频不是本人制作,如侵权则删。当然网上的视频有很多,我只是找了一个相对简单明了的,大家也可自行搜索。

参考资料:《数据结构-用C语言描述》高等教育出版社

(只是分享个人学习时的想法和理解,如有问题还望大佬指点)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

#include编程小黑

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值