直接插入排序是比较简单的排序算法,它主要是将我们要排序的序列分成两个部分,一个有序一个无序,然后将无序序列中的值依次插入到有序序列中。
这么讲如果不能理解,我们拿例子去讲,假如有序列8 7 2 1 5 9 3这么一个序列,如下表所示。我们要将这个序列进行升序排序,接下来演示插入排序的过程。
初始序列
| 8 | 7 | 2 | 1 | 5 | 9 | 3 |
|---|
第一次排序
从前往后排,将8作为我们的有序序列的第一个值,而8后面的值都是无序的,也就是得到(8)7 2 1 5 9 3这么一个序列。
| *8 * | 7 | 2 | 1 | 5 | 9 | 3 |
|---|
第二次排序
第二次从无序序列中找到第一个值也就是7,然后将其插入到有序序列中,也就是插到8的前面,这里就需要将8往后移动一个位置,得到排好的序列
(7 8)2 1 5 9 3
| 7 | 8 | 2 | 1 | 5 | 9 | 3 |
|---|
第三次排序
从无序序列中找到第一个值也就是2,然后将其插入到有序序列中,也就是插到7的前面,需要将7 8后移一位,然后再将2插入,得到排好的序列
(2 7 8)1 5 9 3
| 2 | 7 | 8 | 1 | 5 | 9 | 3 |
|---|
第四次排序
从无序序列中找到第一个值也就是1,然后将其插入到有序序列中,也就是插到2的前面,需要将2 7 8后移一位,然后再将1插入,得到排好的序列
(1 2 7 8)5 9 3
| 1 | 2 | 7 | 8 | 5 | 9 | 3 |
|---|
按照上上述步骤方法进行排序,下面步骤就不多做解释了。
第五次排序
(1 2 5 7 8)9 3
| 1 | 2 | 5 | 7 | 8 | 9 | 3 |
|---|
第六次排序
(1 2 5 7 8 9 )3
| 1 | 2 | 5 | 7 | 8 | 9 | 3 |
|---|
第七次排序
(1 2 3 5 7 8 9 )
| 1 | 2 | 3 | 5 | 7 | 8 | 9 |
|---|
直至得到完整的有序序列,直接插入排序结束。要注意的就是要移动序列的时候的问题。具体看题目解题代码,如下:
习题8-1 直接插入排序给定一个整数序列,请按非递减序输出采用直接插入排序的各趟排序后的结果。
输入格式:
测试数据有多组,处理到文件尾。每组测试数据第一行输入一个整数n(1≤n≤100),第二行输入n个整数。
输出格式:
对于每组测试,输出若干行,每行是一趟排序后的结果,每行的每两个数据之间留一个空格。
输入样例:
4
8 7 2 1
输出样例:
7 8 2 1
2 7 8 1
1 2 7 8
代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB
解题代码
#includeusing namespace std; int main() { int n,t; while(cin>>n){ int nums[n+1]; for(int i=0;i cin>>nums[i]; } for(int i=1;i t=nums[i]; for(int j=0;j if(nums[j]>t){ for(int k=i;k>=j+1;k--){ nums[k]=nums[k-1]; } nums[j]=t; break; } } for(int j=0;j if(j==0) cout<



