数据结构经典排序算法(一)——直接插入排序

一、基本思路:

将一条记录插入到已排好序的有序表中,从而得到一个新的、记录数量增加1的有序表。

二、算法步骤

① 设待排序的记录存放在数组r[1…n]中,r[1]是一个有序序列。
②循环n-1次,每次使用循环查找法,查找r[i] (i=2,…,n)在已排好的序列r[1…i-1]中的插入位置,然后将r[i]插入表长为i-1的有序序列r[1,…,i-1],直到将r[n]插入表长为n-1的有序序列r[1,…,n-1],最后得到一个表长为n的有序序列。

三、步骤图解

在这里插入图片描述

四、关键代码(C++)

void InsertSort(SqList &L)     //直接插入排序
{
    
    
    for(int i=2;i<=L.length;++i)
    {
    
    
        int j;
        if(L.r[i].key<L.r[i-1].key)
        {
    
    
            L.r[0] = L.r[i];     //将待插入的记录暂存到监视哨
            L.r[i] = L.r[i-1];    //r[i-1]后移
            for(j=i-2;L.r[0].key<L.r[j].key;--j)
                L.r[j+1] = L.r[j];
            L.r[j+1] = L.r[0];
        }
    }
}

五、完整程序

/*
*author:weiyuexin 
*date: 2020/12/18
*/ 

#include<iostream>

using namespace std;

#define MAXSIZE 100

typedef int KeyType;    //定义关键字类型为整型
typedef int InfoType;
typedef struct{
    
          //记录类型
    KeyType key;         //关键字项
    InfoType otherinfo;     //其他数据项
}RedType;
typedef struct{
    
    
    RedType r[MAXSIZE+1];       //r[0]闲置或用作哨兵单元
    int length;       //顺序表长度
}SqList;

void insertList(SqList &L)
{
    
    
    cout<<"请输入元素个数:"<<endl;
    int n;
    cin>>n;
    cout<<"请输入"<<n<<"个元素(以空格隔开):"<<endl;
    for(int i=1;i<=n;i++)
    {
    
    
        cin>>L.r[i].key;
    }
    L.length=n;
    cout<<n<<"个元素插入到顺序表成功!"<<endl;
}

void Display(SqList L)
{
    
    
    for(int i=1;i<=L.length;i++)
    {
    
    
        cout<<L.r[i].key<<" ";
    }
    cout<<endl;
}

void InsertSort(SqList &L)     //直接插入排序
{
    
    
    for(int i=2;i<=L.length;++i)
    {
    
    
        int j;
        if(L.r[i].key<L.r[i-1].key)
        {
    
    
            L.r[0] = L.r[i];     //将待插入的记录暂存到监视哨
            L.r[i] = L.r[i-1];    //r[i-1]后移
            for(j=i-2;L.r[0].key<L.r[j].key;--j)
                L.r[j+1] = L.r[j];
            L.r[j+1] = L.r[0];
        }
    }
}

int main()
{
    
    
    cout<<"-----------直接插入排序-------------"<<endl;
    SqList L;
    insertList(L);
    cout<<"初始化后的顺序表为:"<<endl;
    Display(L);
    InsertSort(L);
    cout<<"直接插入排序后的序列为:"<<endl;
    Display(L);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_46353366/article/details/111397960