挑战程序设计竞赛选读
一、初等排序
1.插入排序
插入排序是指将未排序序列分为已排序列和待排序列,通过将第一个待排序列的元素插入到已排序列的方式使整个序列逐渐全部有序。
正确性分析:每次插入,都会使已排序列增长,待排序列减少,符合减而治之(decrease-and-conquer)的分析问题的原则。
复杂度分析:在最坏的情况下(整个倒序),每次插入都会使其后的元素全部移动,当序列长为N时,需移动
1 + 2 + 3 + ⋯ + N = N ( N − 1 ) 2 = O ( N 2 ) 1+2+3+\dots+N = \frac{N(N-1)}{2}=O(N^2) 1+2+3+⋯+N=2N(N−1)=O(N2)
即,时间复杂度为 O ( N 2 ) O(N^2) O(N2) 级。
图例:
待排序列
排序过程:
C++实现:
#include<iostream>
#include<vector>
using namespace std;
void trace(vector<int> const a)
{
for(auto i : a)
cout<<i<<' ';
cout<<endl;
}
void insertSort(vector<int> & a)
{
size_t length = a.size();
for(size_t i = 1; i < length;i++) //待排序列从下标1开始
{
int v = a[i] ; //待排元素
int j = i-1 ; //已排序列的最后一个元素位置
while (j >= 0 && a[j] > v) //将待排元素与已排数组由后向前比较(便于插入时移动元素),比它大的后移
{
a[j+1] = a[j];
j -- ;
}//找到已排序列中比待排元素小的位置了
a[j+1] = v;
trace(a);
}
}
int main()
{
vector<int> a = {8,6,7,1,5};
trace(a);
insertSort(a);
return 0;
}
rust实现:待更(我还在学习,hahahaha…)