目录
🍉 原理介绍:
它的基本思想是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序。
🍉 特点:
-
稳定:插入排序是一种稳定的排序算法,它能够保证在排序过程中相等元素的相对位置不变。
-
最坏情况下比较n*(n-1)/2次,最好情况下比较n-1次;
-
第k次排序后,前k个元素已经是排好序的。
🍉 代码示例:普通插入排序
/*****************************************************
* @description: ordinary insert
* @author: kashine
* @version: 1.0
* @mail: likaiqinchina@gmail.com
* @date: 2022/12/25
******************************************************/
#include <iostream>
using namespace std;
void insert_sort(int array[], int num)
{
int key, j;
// 从第二个元素开始,默认第一个元素有序
for(int i = 1; i < num; i++)
{
key = array[i];
j = i - 1;
while(j >= 0 && key < array[j])
{
array[j + 1] = array[j];
j--;
}
array[j+ 1] = key;
}
}
void display(int array[], int num)
{
for(int i = 0; i < num; i++)
{
cout<< array[i]<< " ";
}
cout<<endl;
}
int main()
{
int array[] = {5, 2, 4, 6, 1, 3};
int num = sizeof(array) / sizeof(array[0]);
display(array, num);
insert_sort(array, num);
display(array, num);
return 0;
}
🍉 算法复杂度:
最好时间复杂度:O(N) 有序
最坏时间复杂度:O(N2)
平均时间复杂度:O(N2)
🍉 改进方案:
二分(折半)插入排序:二分插入排序是插入排序的另一种改进版本,它通过使用二分查找来确定待插入元素的位置,从而减少比较的次数。
二分插入排序:
/*****************************************************
* @description: binary insert sort
* @author: kashine
* @version: 1.0
* @mail: likaiqinchina@gmail.com
* @date: 2022/12/25
******************************************************/
#include <iostream>
using namespace std;
// 折半插入排序
void binary_insert_sort(int array[], int num)
{
int key;
int left, right, mid = 0;
// 从第二个元素开始,默认第一个元素有序
for(int i = 1; i < num; i++)
{
key = array[i];
left = 0;
right = i - 1;
while(left <= right)// 第一次需要等号
{
mid = (left + right) / 2;
if(array[mid] > key)right = mid - 1;// key一定要放在mid的左边
else left = mid + 1;// key一定要放在mid的右边
cout<< left<< " "<< right<<endl;
}
cout<<endl;
// left和right最终一定会指向同一个元素,然后再执行一次while后跳出
// 如果这个元素大于key,right = mid - 1,left指向最后一个大于key的元素
// 如果这个元素小于key,left = mid + 1,left指向最后一个大于key的元素
for(int j = i - 1; j >= left; j--)
{
array[j + 1] = array[j];// 当前元素左侧比key大的元素往左移,覆盖掉key所在位置
}
array[left] = key;// 将当前待排序元素插入到指定位置
}
}
void display(int array[], int num)
{
for(int i = 0; i < num; i++)
{
cout<< array[i]<< " ";
}
cout<<endl;
}
int main()
{
int array[] = {5, 2, 4, 6, 1, 3, 20, 35, 16, 164, 28, 46, 69};
int num = sizeof(array) / sizeof(array[0]);
display(array, num);
binary_insert_sort(array, num);
display(array, num);
return 0;
}