插入排序(英语:Insertion Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到{\displaystyle O(1)}的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。
快速排序示意过程
插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。 是稳定的排序方法。
设有一组关键字{K1, K2,…, Kn};排序开始就认为 K1 是一个有序序列;让 K2 插入上述表长为 1 的有序序列,使之成为一个表长为 2 的有序序列;然后让 K3 插入上述表长为 2 的有序序列,使之成为一个表长为 3 的有序序列;依次类推,最后让 Kn 插入上述表长为 n-1 的有序序列,得一个表长为 n 的有序序列。
具体算法描述如下:
如果比较操作的代价比交换操作大的话,可以采用二分查找法来减少比较操作的数目。该算法可以认为是插入排序的一个变种,称为二分查找排序。
二分查找法,是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。
下面举个例子,初始数组 {12, 15, 9, 20, 6, 31, 24}
我们把第一个元素12作为已经排序号的数组,用中括号括起来,方便我们观察
那么初始数组:[12], 15, 9, 20, 6, 31, 24
第一步,拿着15和12比较,发现15大于12,把15插入到12后面,于是当前数组变成
数组结果:[12, 15 ], 9, 20, 6, 31, 24
第二步,拿着9和15比较,发现15>9,把15向后面移动一位,在把9和12比较发现12>9,把12向后移动一位,最后把9插入
数组结果:[9,12, 15 ], 20, 6, 31, 24
第三步,拿着20和15比较,发现15<20,不需要调整
数组结果:[9,12, 15 ,20], 6, 31, 24
如此执行下去,直到所有排序完成,
上面一张图能完美的展示整个排序过程 ,其中虚线代表while中循环执行的,
#include
#include
using namespace std;
void InsertSort(int a[], int n)
{
for (int j = 1; j < n; j++)
{
int key = a[j]; //待排序第一个元素
int i = j - 1; //代表已经排过序的元素最后一个索引数
while (i >= 0 && key < a[i])
{
//从后向前逐个比较已经排序过数组,如果比它小,则把后者用前者代替,
//其实说白了就是数组逐个后移动一位,为找到合适的位置时候便于Key的插入
a[i + 1] = a[i];
i--;
}
a[i + 1] = key;//找到合适的位置了,赋值,在i索引的后面设置key值。
}
}
int main() {
int d[] = { 12, 15, 9, 20, 6, 31, 24 };
cout << "输入数组 { 12, 15, 9, 20, 6, 31, 24 } " << endl;
InsertSort(d,7);
cout << "排序后结果:";
for (int i = 0; i < 7; i++)
{
cout << d[i]<<" ";
}
//return 0;
}
程序运行结果:
本文参考链接及学习资料:
【1】常见排序算法 - 插入排序 (Insertion Sort)http://bubkoo.com/2014/01/14/sort-algorithm/insertion-sort/
【2】c++ 插入排序算法 https://www.cnblogs.com/clc2008/p/6847780.html