插入排序算法思想

插入排序的基本思想是:将整个数组a分为有序和无序的两个部分。前者在左边,后者在右边。开始有序的部分只有a[0] , 其余都属于无序的部分。每次取出无序部分的第一个(最左边)元素,把它加入有序部分。假设插入合适的位置p,则原p位置及其后面的有序部分元素都向右移动一个位置,有序的部分即增加了一个元素。一直做下去,直到无序的部分没有元素。

这个也有稳定不稳定之分,如果不清楚的话,浏览这个文章:https://blog.csdn.net/qq_41045071/article/details/81053250

程序如下:

void InsertionSort(int a[], int size)
{
	for(int i = 1;i < size;i++){
	//a[i]是最左边的无序元素,每次循环将a[i]放到合适位置 
		for(int j = 0;j < i;j++){
			if(a[j] > a[i]){
				//要把a[i]放到位置j,原下标j到i-1的元素都往后移一位 
				int tmp = a[i];
				for(int k = i;k > j;k--;)
					a[k] = a[k-1];
				a[j] = tmp;
				break; 
			}		
		} 
	}
} 
复杂度分析:外重循环需要执行(size-1)次。每次外重循环执行时,假设在j=n时执行了第12行的break语句,则此时第6行的a[j]>a[i]已经被执行了n+1次。当j=n时,会执行第9行的循环,该循环的k>j这个判断会被执行i-j+1次,即i-n+1次。于是,每次外重循环执行时,两种操作合计执行i+2次。也可以定义一种操作,叫作“执行a[j]>a[i]或k>j”,则每次执行外重循环时,该操作一共被执行i+2次。i从1变到size-1,因此合计执行次数为3+4+...+(size+1),这个复杂度也是 O(size^2)的。
  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值