一、基本思路:
将一条记录插入到已排好序的有序表中,从而得到一个新的、记录数量增加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;
}