1、直接插入排序介绍
插入排序(英文名称:Insertion Sort)分为直接插入排序、折半插入排序、希尔排序(shell sort),后两种是在直接插入排序的改进上而来。
2、直接插入排序演示
动画演示链接:Insertion Sort Animation by Y. Daniel Liang
3、直接插入排序原理
插入排序是将数据及分为 已排序(演示图黄色数据) 和 待排序(演示图浅蓝色数据) 两个区间,每次的排序过程就是从待排序中取出一个,插入到已排序中的相应位置,重复的将新的元素插入一个已排序的子线性表中,直到整个线性表排好序。
4、直接插入排序性能
1、稳定性
算法稳定性是指如果待排序的序列中存在值相等的元素,经过排序之后,相等元素之间原有的先后顺序不变。
直接插入排序是稳定的。每次插入元素时,总是从后向前比较再移动,所以相同元素的相对位置不会发生变化,直接插入排序是一个稳定的排序算法。2、时间复杂度
算法的时间复杂度会随着排序集合的有序性而改变。
最好时间复杂度:在完全有序或有序度为满的情况下的时间复杂度
最坏时间复杂度:在完全逆序或有序度为 0 的情况下的时间复杂度
----------------------------------------------------------------------------------------
直接插入排序最好情况:时间复杂度是,完全有序
直接插入排序最坏情况:时间复杂度是,每次都插入到已排序序列的队头
3、空间复杂度
算法的空间复杂度就是内存消耗。
直接插入排序的空间复杂度为,因为直接插入排序并没有开第二个数组,它仅仅只是就着他自己的原来的数组进行排序,利用的存储空间是常数个空间,因而其空间复杂度为
。
4、原地排序
原地排序(Sorted in place)是指空间复杂度为的排序算法。
5、直接插入排序C++代码实现
int* InsertSort(int arr[], int len) {
int i, j, temp;
for (i = 1; i < len; i++) {
temp = arr[i];
for (j = i - 1; j >= 0 && temp < arr[j]; j--) {
arr[j + 1] = arr[j]; //后移
}
arr[j + 1] = temp; //插入
}
return arr;
}
6、直接插入排序C++代码优化
优化思想:同直接插入排序一致,但在进行元素比较时采用的是折半查找,在查找待插入位置时时间复杂度为
(折半查找的时间复杂度)。优化后的排序算法为折半插入排序。
int* InsertSort(int arr[], int len) {
int i, j, temp, low, mid, high;
for (i = 1; i < len; i++) {
temp = arr[i];
//折半比较
low = 0;
high = i - 1;
while (low <= high) // 注意这里要取等号,使得high<low才结束循环
{
mid = (low + high) / 2;
if (arr[mid] > temp)
high = mid - 1;
else
low = mid + 1;
}
for (j = i - 1; j >= high + 1; j--) {
arr[j + 1] = arr[j]; //后移
}
arr[high + 1] = temp; //插入
}
return arr;
}