插入排序
插入排序类似于我们打牌的时候对手中的牌进行排序的过程,具体过程为:插入排序会将数组分为“已排序部分”和“未排序部分”。首先将开头元素看成已经排序部分。然后执行取出未排序部分的头元素赋值给变量v,将v和已排序部分进行比较,比v大的都向后挪一个单位,随后找出空位插入v,一直循环这个操作直到未排序部分消失。
插入排序是一种稳定排序,因为在排序中,我们只是将比v大的元素向后平移,不相邻的元素不会交换位置。总体来说插入排序是一种复杂度o(n^2)的算法,另外插入排序在处理相对有序的元素进行排序的时候效率是十分高的,因为元素相对有序那么元素移动的次数就会减少很多次,相应的效率也会提高。
下面来一道具体的题目:
Write a program of the Insertion Sort algorithm which sorts a sequence A in ascending order. The algorithm should be based on the following pseudocode:
for i = 1 to A.length-1
key = A[i]
/* insert A[i] into the sorted sequence A[0,…,j-1] */
j = i - 1
while j >= 0 and A[j] > key
A[j+1] = A[j]
j–
A[j+1] = key
Note that, indices for array elements are based on 0-origin.
To illustrate the algorithms, your program should trace intermediate result for each step.
Input
The first line of the input includes an integer N, the number of elements in the sequence.
In the second line, N elements of the sequence are given separated by a single space.
Output
The output consists of N lines. Please output the intermediate sequence in a line for each step. Elements of the sequence should be separated by single space.
Constraints
1 ≤ N ≤ 100
Sample Input 1
6
5 2 4 6 1 3
Sample Output 1
5 2 4 6 1 3
2 5 4 6 1 3
2 4 5 6 1 3
2 4 5 6 1 3
1 2 4 5 6 3
1 2 3 4 5 6
Sample Input 2
3
1 2 3
Sample Output 2
1 2 3
1 2 3
1 2 3
代码如下:
#include<bits/stdc++.h>
using namespace std;
#define MAX 1000
int a[MAX];
int n;
void print()
{
for(int i = 0;i < n;i++)
{
if(i) cout << " ";
cout << a[i];
}
cout << endl;
}
void insertsort()
{
int v,j;
for(int i = 1;i < n;i++)
{
v = a[i];
j = i - 1;
while(j >= 0 && v < a[j])
{
a[j + 1] = a[j];
j = j - 1;
}
a[j + 1] = v;
print();
}
}
int main()
{
scanf("%d",&n);
for(int i = 0;i < n;i++) scanf("%d",&a[i]);
print();
insertsort();
return 0;
}
知道了上述的插入排序的方法后,再做这道题就十分容易了,这里需要注意的是空格换行符等格式问题。