文章目录
- 直接插入排序
直接插入排序
核心代码
void InsertSort(int arr[], int n)
{
for (int i = 2; i <= n; ++i) ///直接从第二个元素开始遍历
{
if (arr[i - 1] > arr[i]) //判断前一个元素和当前元素的大小,若前一个元素小于当前元素才需要插入
{
arr[0] = arr[i]; 将arr[i]保存在arr[0]中
arr[i] = arr[i - 1]; /由于arr[i]是小于arr[i-1]的,所以需要将arr[i-1]往后移
int j = 0;
for (j = i - 2; arr[0] < arr[j]; --j) 然后判断第i-2个元素,我们需要找到一个arr[0]大于等于前一个元素的后一个位置然后插入,
{ 判断第j个元素如果该元素大于arr[0]则往后移,最终arr[j]<arr[0]
arr[j + 1] = arr[j];
}
arr[j + 1] = arr[0];
}
print(arr, n);
cout << endl;
}
}
算法演示:
计算复杂度:
若是正序序列:
- 比较次数: n-1
- 移动次数: 0
若是逆序序列:
- 比较次数: ∑ i = 2 n i = ( n − 1 ) ( n + 2 ) 2 \sum_{i=2}^n {i} = \frac{(n-1)(n+2)}{2} i=2∑ni=2(n−1)(n+2)
- 移动次数: ∑ i = 2 n i + 1 = ( n + 4 ) ( n − 1 ) 2 \sum_{i=2}^n{i+1}=\frac{(n+4)(n-1)}{2} i=2∑ni+1=2(n+4)(n−1)
时间复杂度: T ( n ) = O ( n 2 ) T(n)=O(n^2) T(n)=O(n2)