一.直接插入排序
直接插入排序(Straight Insertion Sort)是一种最简单的排序方法,其基本操作是将一条记录插入到已排好的有序表中,从而得到一个新的、记录数量增1的有序表
1.直接插入排序的基本思想:
以数组int arr[] = { 3, 1, 4, 6, 5, 9, 2, 7, 8 }; 为例:
1.)我们以第一个数据3为有序数列
2.)从第二个开始,将每次拿到的数先保存起来,然后循环和有序数列中的数作比较,最后将拿到的数插入它的有序位置
2.大白话理解
很多排序方法,都可以用我们小时候上学排队的方式来解释。插入排序,想一下以前在上课的时候,老师在给我们排队时,有没有这样的举动,让你和在你前面的同学,比身高,如果你比前面的同学矮的话,前面的同学就站到你的位置,然后你在和你现在前面的同学进行身高比较,如果你还是比较矮的话,前面的同学则换到你的位置。直到你比前面同学高为止,将你插入前面同学后面。
假设老师从第二个同学开始调整位置,然后一直调整到最后一位,那么这种排序的方法就叫做插入排序。
我们可以从下方的动图中很容易看到直接插入排序的思想:
代码展示:
void InsertSort(int* arr, int sz)
{
for (int i = 1; i < sz; ++i)
{
int j = i - 1;
//将拿到的数保存
int temp = arr[i];
int count = 0;
//循环比较
while (j>=0 && arr[j] > temp)
{
//搬移元素
if (arr[j] > temp)
{
arr[j+1] = arr[j];
++count;
}
--j;
}
if (count > 0)
{
//最后将拿到的数据插入有序的位置
arr[j+1] = temp;
}
}
二.总结
我们可以看出直接插入排序,在每次插入元素时,只是找比他大的元素,然后去搬移数据。这样在排序成功后不会影响数组内每个数的相对位置。所以直接插入排序是稳定的排序
时间复杂度:O(n*n)
空间复杂度:O(1)