数据结构经典排序算法(一)——直接插入排序
一、基本思路:
将一条记录插入到已排好序的有序表中,从而得到一个新的、记录数量增加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; }