//直接插入排序 #include<iostream> #include<fstream> using namespace std; #define MAXSIZE 20 //顺序表的最大长度 #define OK 0 #define ERROR -1 typedef char* InfoType; typedef struct { int key;//关键字项 InfoType otherinfo;//其他数据项 }RedType;//记录类型 typedef struct { RedType r[MAXSIZE+1];//r[0]闲置或用做哨兵单元 int length;//顺序表长度 }SqList;//顺序表类型 //初始化一个空的顺序表L void InitSqList(SqList &L) { L.length = 0; } //将待排序记录依次插入顺序表L void InsertSqList(SqList &L,ifstream& in) { int n;//待排序记录的个数 in>>n; if(n > MAXSIZE) exit(ERROR); for(int i=1; i<=n; ++i) { in>>L.r[i].key; ++L.length; } } //打印顺序表L void show(SqList L) { for(int i=1; i<=L.length; ++i) cout<<L.r[i].key<<" "; cout<<endl; } //对顺序表L做直接插入排序 //要求调用show函数打印每一趟排序的结果 void InsertSort(SqList &L) { show(L);//打印初始待排序序列 /*-------------代码开始------------------*/ for(i=2;i<L.length;++i) if(L.r[i].key<L.r[i-i].key) { L.r[0]+L.r[i]; L.r[i]=L.r[i-1]; for(j=i-2;L.r[0].ke y<L.r[j].key;--j) L.r[J+1]=L.r[j]; L.r[j+1]=L.r[0]; } /*-------------代码结束------------------*/ } int main() { ifstream in("data/测试数据.txt");//测试数据 SqList L; InitSqList(L); InsertSqList(L,in); InsertSort(L); return OK; }优化这段代码
时间: 2024-04-06 17:29:52 浏览: 74
这段代码的直接插入排序算法实现存在一些问题,比如变量i和j没有定义,以及在插入排序的过程中没有调用show函数打印每一趟排序的结果。此外,这段代码中的排序算法实现也没有进行优化。以下是优化后的代码:
```c++
//直接插入排序
#include<iostream>
#include<fstream>
using namespace std;
#define MAXSIZE 20 //顺序表的最大长度
#define OK 0
#define ERROR -1
typedef char* InfoType;
typedef struct {
int key;//关键字项
InfoType otherinfo;//其他数据项
}RedType;//记录类型
typedef struct {
RedType r[MAXSIZE+1];//r[0]闲置或用做哨兵单元
int length;//顺序表长度
}SqList;//顺序表类型
//初始化一个空的顺序表L
void InitSqList(SqList &L) {
L.length = 0;
}
//将待排序记录依次插入顺序表L
void InsertSqList(SqList &L,ifstream& in) {
int n;//待排序记录的个数
in>>n;
if(n > MAXSIZE) exit(ERROR);
for(int i=1; i<=n; ++i) {
in>>L.r[i].key;
++L.length;
}
}
//打印顺序表L
void show(SqList L) {
for(int i=1; i<=L.length; ++i)
cout<<L.r[i].key<<" ";
cout<<endl;
}
//对顺序表L做直接插入排序
//要求调用show函数打印每一趟排序的结果
void InsertSort(SqList &L) {
show(L);//打印初始待排序序列
/*-------------代码开始------------------*/
for(int i=2; i<=L.length; ++i) {
if(L.r[i].key < L.r[i-1].key) {
L.r[0] = L.r[i]; //将L.r[i]暂存到L.r[0]
int j;
for(j=i-1; L.r[0].key < L.r[j].key; --j) {
L.r[j+1] = L.r[j]; //记录后移
}
L.r[j+1] = L.r[0]; //插入到正确位置
}
show(L); //打印每一趟排序的结果
}
/*-------------代码结束------------------*/
}
int main() {
ifstream in("data/测试数据.txt");//测试数据
SqList L;
InitSqList(L);
InsertSqList(L,in);
InsertSort(L);
return OK;
}
```
在优化后的代码中,我们对直接插入排序算法进行了优化,具体包括:
1. 在插入排序的过程中,使用了哨兵技术,将L.r[i]暂存到L.r[0]中,避免了反复交换记录的操作。
2. 在排序过程中,每次插入一个记录后,都调用show函数打印出当前的排序结果,方便查看。
这样,优化后的代码可以更加高效地完成直接插入排序算法,并且可以更加清晰地展示算法执行的过程。
阅读全文