🚩 插入排序
💡 基本思想
每一步把待排序的元素与前面已排序的数组的元素进行比较,正确的把元素放入前面的数组
动画:插入排序
🚩 C语言的实现
// input: int *A: 待排序的数组
// int size: 数组大小
// output: 已排序的数组
void InsertionSort(int *A, int size){
for (int cmp = 1; cmp <= size - 1; cmp++){
int key = A[cmp];
int i = cmp - 1;
while (i >= 0 && A[i] > key){ // compare key and the elements in the sorted array
A[i + 1] = A[i];
i--;
}
A[i + 1] = key;
}
}
🚩 时间复杂度分析
-
The Best Case - O(N)
输入的数据以预先排序,那么每次内层循环的检测仅需要比较判定的一步,因此时间复杂度为O(N) -
The Worst Case - O(N^2)
输入的数据以倒序排序,那么每次内层循环都需要与已排序的数组的每个数据进行比较,因此时间复杂度为O(N^2)
∑ i = 1 n i = 2 + 3 + 4 + . . . + N = O ( N 2 ) \sum_{i=1}^{n} i = 2 + 3 + 4 + ... + N = O(N^{2}) i=1∑ni=2+3+4+...+N=O(N2) -
The Average Case - O(N^2)
我们可以假设平均情况下数组中的元素都比数组中一半的元素小,则每次插入需进行 N/2 次操作,一共有 N-1 次插入操作,因此时间复杂度为O(N^2)
📖 以上均为个人学习数据结构算法时的小笔记,如有错误请多多指正