插入排序Insertion sort详细代码

文章目录

  • 插入算法介绍
    • 动图演示
  • 代码实现
  • 特性总结

插入算法介绍

插入算法的核心思想:维护一个有序区间
平均时间复杂度: O ( n 2 ) O(n^2) O(n2);最差情况: O ( n 2 ) O(n^2) O(n2);最好情况: O ( n ) O(n) O(n)
空间复杂度: O ( 1 ) O(1) O(1)
排序方式:内排序
稳定性:稳定

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


动图演示

动图来源网络
插入排序Insertion sort详细代码_第1张图片


代码实现

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)
至于空间复杂度,由于插入排序是原地排序,并没有借助额外的储存空间,所以空间复杂度是 O(1)


特性总结

元素集合越接近有序,直接插入排序算法的时间效率就越高

你可能感兴趣的:(排序算法,算法,数据结构)