0
点赞
收藏
分享

微信扫一扫

插入排序Insertion sort详细剖析

文章目录

插入算法介绍

插入算法应该算得上是最容易理解的算法了,只要是玩过扑克牌的人一眼就能看懂插入排序的思想。
通俗来说就是我有6,7,9,10这四张牌,然后我摸到一张 8 ,最自然也是最简单的方法就是在已经有序的四张牌里面找到 8 应该插入的位置,也就是 79 之间,然后把 8 插入进去。
插入排序的思想就是这么的简单,一个一个地把元素插入到合适的位置,直到所有元素都有序为止。


动图演示

动图来源网络
插入排序


代码实现

void InsertSort(int* a, int n) {
	//for循环不断维护有序区
	for (int i = 0; i < n - 1; ++i) {
		//end是有序区的末尾
		int end = i;
		//tmp储存有序区间的下一个元素,即是要插入的元素
		int tmp = a[end + 1];
		while (end >= 0) {
			//不断while直到找到比tmp大的元素
			if (tmp < a[end]) {
				//当前end元素比tmp大,则要复制end到下一个位置
				a[end + 1] = a[end];
				//更新end位置,进行下个循环的比较
				--end;
			}
			else {
				//找到比tmp大的元素跳出循环
				break;
			}
		}
		//将暂存的tmp赋值到end+1的位置
		a[end + 1] = tmp;
	}
}

插入排序要进行 n-1 轮, 每一轮在最坏的情况下的比较次数分别是 1 次、 2次、 3 次······一直到 n-1 次,所有最坏的时间复杂度是 O(n2)
至于空间复杂度,由于插入排序是原地排序,并没有借助额外的储存空间,所以空间复杂度是 O(1)

举报

相关推荐

0 条评论