插入排序

插入排序

插入排序类似于我们打牌的时候对手中的牌进行排序的过程,具体过程为:插入排序会将数组分为“已排序部分”和“未排序部分”。首先将开头元素看成已经排序部分。然后执行取出未排序部分的头元素赋值给变量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;
}

知道了上述的插入排序的方法后,再做这道题就十分容易了,这里需要注意的是空格换行符等格式问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值