插入排序包含直接插入排序、折半插入排序、希尔排序
数据结构插入排序的实现
数据结构中的插入排序主要包括直接插入排序、折半插入排序、希尔排序等等,其基本思想是每次将一个待排序的记录按关键字大小插入到前面已排好序的子序列中,直到全部记录都插入完成,因此空间复杂度都是O(1),而时间复杂度各有不同。
1. 直接插入排序
直接插入排序是一种稳定排序,平均时间复杂度:O(n²),空间复杂度:O(1),基本思想:在一个数组中,将后面无序的关键字插入到前面已经有序的子序列中,注:A[]数组从1开始存放关键字,A[0]用于存放交换的关键字
![](https://images2017.cnblogs.com/blog/849589/201710/849589-20171015225645277-1151100000.gif)
#include <iostream>
using namespace std;
typedef int ElemType;
void InsertSort(ElemType A[], int n) {
int i, j;
for (i = 2; i <= n; i++) { //对整个数组进行遍历,直到全部有序
if (A[i] < A[i - 1]) { //如果出现无序的关键字
A[0] = A[i]; //把该关键字保存到第一个数组A[0]
for (j = i - 1; A[j] > A[0]; j--) //从这一步开始把比所有A[0]大的关键字往后移
A[j + 1] = A[j];
A[j + 1] = A[0]; //把该关键字放入有序的位置
}
}
}
![](https://img-blog.csdnimg.cn/20200318221450976.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1h1eWltaW5nNTY0NDQ1,size_16,color_FFFFFF,t_70)
2. 折半(二分)插入排序
折半插入排序是一种稳定排序,平均时间复杂度:O(n²),空间复杂度:O(1),基本思想:将查找和移动操作分开,在已经排好序的子序列中用折半查找找出元素的插入位置,然后统一移动插入位置之后的所有元素,给要插入的元素留出一个空位
void InsertHalfSort(ElemType A[], int n) {
int i, j, low, high, mid;
for (i = 2; i <= n; i++) { //对整个数组进行遍历,直到全部有序,依次将A[2]到A[n]插入前面已经排序的序列
low = 1, high = i - 1;
A[0] = A[i]; //把该关键字保存到第一个数组A[0]
while (low <= high) {
mid = (low + high) / 2;
if (A[0] < mid)
high = mid - 1;
else
low = mid + 1;
}
for (j = i - 1; j >= high + 1; j--) //统一移动
A[j + 1] = A[j];
A[high + 1] = A[0];
}
}
![](https://img-blog.csdnimg.cn/20200318222323257.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1h1eWltaW5nNTY0NDQ1,size_16,color_FFFFFF,t_70)
3. 希尔排序(缩小增量排序)
希尔排序(缩小增量排序),是一种不稳定的排序算法,把序列分成相隔距离为d的子序列,把这些相隔距离的关键字组成一个子表,然后对其进行直接插入排序,最差时间复杂度为O(n²),最好时间复杂度为O(n(1.3)),空间复杂度为O(1)
void ShellSort(ElemType A[], int n) {
int dk, i, j;
for (dk = n / 2; dk >= 1; dk=dk/2) { //步长变化
for (i = dk + 1; i <= n; i++) { //逐个对该步长下后面的关键字检测
if (A[i] < A[i - dk]) { //若发现有无序的关键字
A[0] = A[i];
//则按当前步长的距离开始移动其后的元素,腾出位置给该关键字
for (j = i - dk; j > 0 && A[0] < A[j]; j -= dk)
A[j + dk] = A[j];
A[j + dk] = A[0];
}
}
}
}
![](https://img-blog.csdnimg.cn/20200318221844894.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1h1eWltaW5nNTY0NDQ1,size_16,color_FFFFFF,t_70)