八大排序之简单插入排序

一、简单插入排序的思想
拿到一个数据将该数据插入到合适的位置这个合适的位置就是插入排序的关键。
简单插入排序将数据分为两个部分:
1、已排序部分
2、待排序部分
二、简单插入排序图解
在这里插入图片描述
如上图所示是我要进行排序的数组,我们将它划分成两部分,红线的左侧是已派序的部分,红线的右侧是未排序的部分。
1、第一趟排序
在这里插入图片描述
我们先定义一个中间变量tmp将所要排序的数字放进去。接下来就是要做的两个操作
1、找合适的位置
2、移动数据
我们将3与12作比较,发现3小于12,我们就将3与12交换,形成新的排序数组
2、第二趟排序

在这里插入图片描述

我们将数组重新划分成已排序的部分和未排序的部分,这时候将21存储到tmp中去进行找合适的位置和移动数据这两个操作。通过比较我们发现21小于12.所以它的位置没有变。此趟排序没有发生数据的移动
3、第三趟排序
在这里插入图片描述
与上趟排序结果一样,还是没有数据的移动
4、第四趟排序
在这里插入图片描述

将数组重新划分,在待排序的部分中拿出一个数据存储到tmp中,然后从头开始比较,找适合它的位置。
这个步骤一般分为两步
1、从头开始找,看最头的这个数据是否小于tmp里的这个数据。
2、从尾开始找,看最尾的数据是否大于tmp里的这个数据
通过比较我们发现3不小于1,所以返回false,现在从尾找。我们发现32、21、12、3都大于1,所以下标就一直向前移动,直到移动到下标为0的位置,然后其他元素均向后移动。
也就是从代码的角度我们可以这样分析:
将已排序好的部分的元素设为x,让x与tmp里面的数字作比较。如果x>1,就将数据向后移,直到下标为-1,这个时候我们就认为已经找到了tmp里面的这个元素的位置,就在下标加一的位置,也就是0号下标的位置。
5、第五趟排序
在这里插入图片描述
方法如上,通过比较我们发现32小于34。那么34的位置就在当前的位置。
6、第六趟排序
在这里插入图片描述

方法如上
7、第七趟排序
在这里插入图片描述
8、第八趟排序
在这里插入图片描述
9、第九趟排序
在这里插入图片描述
排序结束,我们就可以得到一个新的排序好的数组。
三、代码实现

void InsertSort(int arr[],int len)
{
	int i = 1;
	int j = i - 1;
	int tmp;
	for(i;i < len;i++)
	{
		tmp = arr[i];
		for(j = i - 1;j >= 0 && arr[j] > tmp;j--)
		{
			arr[j + 1] = arr[j];
		}
	arr[j + 1] = tmp;
	}
}

四、时间复杂度、空间复杂度和稳定性的分析
1、时间复杂度:O(n^2)
2、空间复杂度:O(1)
3、稳定性:稳定
稳定性是指相同元素在排序前后相对应的位置是否变化。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值