华南农业大学数据结构试验 8638 直接插入排序(个人笔记)

Description

用函数实现直接插入排序,并输出每趟排序的结果

输入格式

第一行:键盘输入待排序关键的个数n
第二行:输入n个待排序关键字,用空格分隔数据

输出格式

每行输出一趟排序结果,数据之间用一个空格分隔

输入样例

10
5 4 8 0 9 3 2 6 7 1

输出样例

4 5 8 0 9 3 2 6 7 1
4 5 8 0 9 3 2 6 7 1
0 4 5 8 9 3 2 6 7 1
0 4 5 8 9 3 2 6 7 1
0 3 4 5 8 9 2 6 7 1
0 2 3 4 5 8 9 6 7 1
0 2 3 4 5 6 8 9 7 1
0 2 3 4 5 6 7 8 9 1
0 1 2 3 4 5 6 7 8 9

算法描述:

简介查找a[i](i=2,3…n)在已排好序的序列a[1]…a[i-1]中的插入位置,然后将a[i]插入到表长为i-1的有序序列a[1]…a[i-1]中,直到将r[n]插入到表长为n-1的有序序列a[1]…a[n-1]中,最后得到表长为n的有序序列。

详细:

(1)建立足够大的数组存放数据,从1开始存放,0为哨兵。

(2)题目要求为升序,首先从下表i=2开始找到 a[i-1]>a[i],然后将哨兵a[0]赋值为a[i]

(3)之后从i-1开始,将比哨兵大的项从后往前移动

(4)重复(2)(3)步骤,形成有序序列

#include <iostream>
/*
Description
用函数实现直接插入排序,并输出每趟排序的结果.
*/
int a[1000],n;
using namespace std;
void Travers()
{
    for(int i=1; i<=n ; i++)
        printf("%d ",a[i]);
    printf("\n");
}
void Insersort(int *a)
{
    int i,j;
    for(i=2; i<=n; i++)
    {
        if(a[i-1]>a[i])//题目要求为升序,若遇到前一项比后一项的大的
        {
            a[0]=a[i];//a[0]处设为哨兵
            for(j=i-1; a[0]<a[j]; j--)//比哨兵大的,从后往前移
                a[j+1]=a[j];
            a[++j]=a[0];//上一行j--后非目标位置,因此要++j
        }
        Travers();
    }
}
int main()
{
    scanf("%d",&n);
    for(int i=1; i<=n; i++)
    {
        printf("%d",a[i]);
    }
    Insersort(a);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值