【基本思想】
像打牌一样,抓到的牌一本按照大小插入适当的位置,这样抓完所有的牌后,手中的牌便是有序的。同理,当读入一个元素时,在已经排序好的序列中找到它正确的位置,放入读入的元素,同时将它后面的所有元素向后移一位。
【排序过程】
9 8 6 7 5 4 2 3 1
第一步: 【9】8 6 7 5 4 2 3 1
第二步: 【8 9】6 7 5 4 2 3 1
第三步: 【6 8 9】7 5 4 2 3 1
第四步: 【6 7 8 9】5 4 2 3 1
第五步: 【5 6 7 8 9】4 2 3 1
第六步: 【4 5 6 7 8 9】2 3 1
第七步: 【2 4 5 6 7 8 9】3 1
第八步: 【2 3 4 5 6 7 8 9】1
第九步: 【1 2 3 4 5 6 7 8 9】
【代码】
#include <bits/stdc++.h>
using namespace std;
int main(){
int n,a[10005];
cin >> n;
for (int i=1;i<=n;i++) cin >> a[i];
for (int i=1;i<=n;i++){
int j,k;
for (j=i-1;j>=1;j--)
if (a[j] <= a[i]) break; //若找到合适位置,结束循环以保留此时j的值
if (j != i-1){
int temp=a[i];
for (k=i-1;k>j;k--) a[k+1] = a[k]; //插入元素后的元素向后移一位
a[k+1] = temp; //插入元素
}
}
for (int i=1;i<=n;i++) cout << a[i] << " ";
return 0;
}
【算法分析】
在插入排序中,共进行n-1次选择,每次选择需遍历从i-1到1的区间,即1+2+…+(n-2)+(n-1)=
n(n-1)/2,故时间复杂度为O(),由于所需存储空间不会随着n值的变化而变化,因此空间复杂度
为O(1),属于稳定,简单但效率低的算法。