插入排序
原理分析
将一个记录插入到已排好序的序列中,从而得到一个新的有序序列
将序列的第一个数据看成是一个有序的子序列,然后从第二个记录逐个向该有序的子序列进行有序的插入,直至整个序列有序
代码实现
#include<iostream>
using namespace std;
void printArray(int *arr, int len)
{
for (int i = 0; i < len; ++i)
{
cout << arr[i] << " ";
}
cout << endl;
}
void InsertSort(int *arr, int len)
{
for (int i = 1; i < len; ++i)
{
if (arr[i] > arr[i - 1])
{
int temp = arr[i];
int j = i - 1;
/*
4 5 8 9 1 2
*/
for (; j >= 0 && temp > arr[j]; j--)
{
arr[j + 1] = arr[j];
}
arr[j + 1] = temp;
}
}
}
int main()
{
int arr[] = { 4,5,8,9,1,2 };
int len = sizeof(arr) / sizeof(int);//通过字节计算数组大小
printArray(arr, len);
InsertSort(arr, len);
printArray(arr, len);
return 0;
}
时间复杂度计算
最好情况(有序) | 最差情况(逆序) | 时间复杂度 | |
比较次数 | n-1 | 1+2+3+4+……+n-1=(n-1)n/2 | O(n) |
移动次数 | 0 | 1+2+3+……+n-1=(n-1)n/2 | O(n^2) |
取平均值,所以时间复杂度为O(n^2)
空间复杂度
在直接插入排序中只使用了i,j,tmp这三个辅助元素,与问题规模无关,空间复杂度为O(1)