流程
- 从第一个元素开始,该元素可以认为已经被排序。
- 取出下一个元素,在已经排序的元素序列中从后向前扫描。
- 如果该元素(已排序)大于新元素,将该元素移到下一位置。
- 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置。
- 将新元素插入到该位置后。
- 重复步骤2~5。
演示
依次输入 9 3 5 4 1。
编号 | 执行操作前的a[] | 操作 | |
---|---|---|---|
0. | 第一轮 | 插入第一个元素9。 | |
1. | 第二轮 | 9 | 比较3和第一个元素,第一个元素后移。 |
2. | 第二轮 | _ 9 | 插入第二个元素3。 |
3. | 第三轮 | 3 9 | 比较5和第二个元素,第二个元素后移。 |
4. | 第三轮 | 3 _ 9 | 比较5和第一个元素,第一个元素不移动。 |
5. | 第三轮 | 3 _ 9 | 插入第三个元素5。 |
6. | 第四轮 | 3 5 9 | 比较4和第三个元素,第三个元素后移。 |
7. | 第四轮 | 3 5 _ 9 | 比较4和第二个元素,第二个元素后移。 |
8. | 第四轮 | 3 _ 5 9 | 比较4和第一个元素,第一个元素不移动。 |
9. | 第四轮 | 3 _ 5 9 | 插入第三个元素4。 |
10. | 第五轮 | 3 4 5 9 | 比较1和第三个元素,第三个元素后移。 |
11. | 第五轮 | 3 4 5 _ 9 | 比较1和第三个元素,第三个元素后移。 |
12. | 第五轮 | 3 4 _ 5 9 | 比较1和第二个元素,第二个元素后移。 |
13. | 第五轮 | 3 _ 4 5 9 | 比较1和第一个元素,第一个元素后移。 |
14. | 第五轮 | _ 3 4 5 9 | 插入第三个元素1。 |
15. | 结束 | 1 3 4 5 9 |
代码
#include <stdio.h>
#define N 1001
int n,a[N],x;
int main()
{
scanf("%d",&n);
for (int j,i=1;i<=n;++i)
{
scanf("%d",&x);
for (j=i-1;j>=1;j--)
if (x<a[j]) a[j+1]=a[j];
else break;
a[j+1]=x;
}
for (int i=1;i<=n;++i) printf("%d ",a[i]);
return 0;
}
时间复杂度
双重循环,O(n^2)。