新手向 算法 插入排序-yang
今天我们来讲插入排序
插入排序的基本原理
插入排序是一种简单直观的排序算法,通过构建有序序列,对未排序的数据逐个插入到已排序序列的适当位置。其时间复杂度为 O(n^2),适合小规模数据排序。
代码实现
//时间复杂度O(n^2) 空间复杂度O(1) 稳定性:稳定
void Insert_Sort(int arr[], int len)
{//for (int i = 0; i < len-1; i++)//控制跑的趟数:len-1趟for (int i = 1; i < len; i++)//i即代表趟数,也代表这一趟待排序值的下标{//提前干一个事:将带排序的值,拷贝给tmp,防止意外被覆盖掉int tmp = arr[i];int j = i - 1;for ( ; j >= 0; j--)//具体控制这一趟中,已排序好的序列从右至左依次和待排序值进行比较{//比较if (arr[j] > tmp)//如果大于tmp,向后挪动一个位置{arr[j+1] = arr[j];}else//如果小于等于tmp,则停下来{//将tmp挪回去(挪回到停下来的位置的后面break;}}//或者触底,则停下来arr[j + 1] = tmp;}
}
代码说明
- 外层循环:从第二个元素开始遍历数组(
i = 1
),因为第一个元素默认是有序的。 - 内层循环:将当前元素
key
与已排序部分的元素从后向前比较,找到合适的插入位置。 - 元素移动:如果已排序部分的元素大于
key
,则将其后移一位。 - 插入操作:最终将
key
插入到正确的位置。
时间复杂度分析
- 最坏情况:数组是逆序的,每次插入都需要移动所有已排序元素,时间复杂度为 O(n^2)。
- 最好情况:数组已经有序,每次插入只需比较一次,时间复杂度为 O(n)。
- 平均情况:时间复杂度为 O(n^2)。
适用场景
插入排序在数据规模较小或部分有序的情况下效率较高,且实现简单。对于大规模数据,更高效的排序算法(如快速排序、归并排序)更合适。