C++ 插入排序

插入排序就是给一个数组进行排序,按照从小到大或从大到小的顺序进行

分为有序表和无序表,有序表就是已经排好的部分,无序表就是未排序的部分

数组中的第一个元素构成的表一定是有序的,因为只有一个元素,所以以第一个元素作为有序表的基准


有序表(第一个元素一定是有序的),把第一个元素看作有序表,其他元素看作无序表
void insertSort(vector<int>& arr) {
	if (arr.size() <= 1) {
		return;
	}
	//j代表无序表第一个数的下标
	for (int j = 1; j < arr.size(); j++) {
		int i = j - 1;//j=1时,i代表数组的第一个元素,由于无法判断什么时候是无序的,但是   数组的第一个元素一定是有序的,i代表有序数组的最后一个元素
		int tmp = arr[j];//用一个临时变量来记录当前所访问的无序表的元素下标
		while (i >= 0&&tmp<arr[i])//一定要把i >= 0的条件放前,否则会出现错误,如果临时变量比有序表最后一个元素小,则需要找到tmp的合适位置,将有序表的数从最后一个向后依次移动
		{
			arr[i + 1] = arr[i];
			i--;
		}
		arr[i + 1] = tmp;//如果临时变量比有序表最后一个元素大,则直接放在有序数组最后一个元素的后面
	}
}

时间复杂度:

最优:O(n) 【假如原来就是有序的,每个元素只需和排好序的最后一个元素比一下即可放置,进行下一个数的比较】

最差:O(n^2)

平均:O(n^2)

空间复杂度:

不需要额外的空间占用,所以为O(1)。

稳定性:

如果碰见一个和插入元素相等的,那么插入元素把想插入的元素放在相等元素的后面。所以,相等元素的前后顺序没有改变,从原无序序列出去的顺序就是排好序后的顺序,所以插入排序是稳定的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值