原理分析
给一个随机数字序列,把序列的第一个数据看为有序的子序列,然后从第二个数据开始依次向该有序的子序列进行有序的插入,直到整个序列有序。
具体过程:记第n+1个数为temp,第n次执行,前n个数为有序序列,将第n+1个数 依次与 第n个数往前依次比较,直到遇到小于该数的数。每执行一次,部分序列往后一位
代码实现
C++ #include <iostream> using namespace std;
void display(int* a, int len) { for (int i = 0; i < 5; i++) { cout << a[i] << " "; } cout << endl; } void sortByInsert(int *a, int len) { int i, j; for (i = 1; i < len; i++) { int temp = a[i]; // 令第i个值为temp for (j = i - 1; j >= 0; j--) { // 从前一个数字开始比较 if(temp <= a[j]){ // 依次与前边的序列比较 a[j + 1] = a[j]; // 依次后移 if (j == 0) { // 若该数比前边所有数都小,则令a[0]为该值 a[0] = temp; } } else { //若出现了小于该值的数,则赋值给下一数并break 此处一定要记得循环的终止条件 a[j+1] = temp; break; } } display(a, len); } }
int main() { int a[5] = { 2,4,1,5,3 }; sortByInsert(a, 5); return 0; } |
分析
自己复现代码时一是未考虑temp值与a[0]的比较,二是未考虑出现小于temp值时要及时break出这一循环的终止条件。
复杂度分析
最小复杂度为顺序序列下O(n)
最大复杂度为逆序序列下O(n~2)
平均复杂度取均值为O(n~2)
源代码
D:\Rjun756\12_算法\230222_insert
六大排序算法
插入排序复杂度分析