目录
1.插入排序(InsertionSort)思想
直接插入排序的思想是,在数组中,将一个数字插入到已经有序的序列里,从而得到一个新的有序的数组
2.示例
假设我们要排序的数组为[32,27,18,22,50,33,8]
下面视频中给出了排序的过程
直接插入排序演示
由示例视频我们可也得出该算法的过程
1.从第一个数开始,将无序部分的第一个数插入到有序数组中
如 27 32 18 22 50 33 8 将无序部分第一个18插入到左侧有序数组中
2.该算法需要遍历每一个数字,然后将这个数字插入到左侧有序部分中
3.示例代码
void InsertionSort(int* arr, int n)
{
if (n <= 1)
return;
for (int i = 1; i < n; i++)
{
for (int j = i - 1; j >= 0 && arr[j] > arr[j + 1]; j--)
swap(arr[j], arr[j + 1]);
}
}
解释:
1.外层循环用于控制无序部分的第一个数字,记为t
2.内层循环根据比较大小依次将这个t向前交换(如果前一个数比后一个数大就交换,如果小于或者遍历完有序部分的所有数字就停止)
4.优化(希尔排序会详解,此处不多介绍)
5.直接插入排序的特点
时间复杂度:
外层循环遍历n次,内层循环最坏情况下由1~n次,故时间复杂度为O(N^2)
空间复杂度:
常量额外变量,O(1)
稳定性
不会交换相同的数字,稳定
6.简单测试
测试代码
void InsertionSort(int* arr, int n)
{
if (n <= 1)
return;
for (int i = 1; i < n; i++)
{
for (int j = i - 1; j >= 0 && arr[j] > arr[j + 1]; j--)
swap(arr[j], arr[j + 1]);
}
}
int main()
{
int arr[] = { 32,27,18,22,50,33,8 };
int len = sizeof(arr) / sizeof(arr[0]);//求数组长度
BubbleSort(arr, len);
for (int i = 0; i < len; i++)//打印数组看是否成功排序
{
cout << arr[i] << " ";
}
cout << endl;
return 0;
}
测试结果