|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
进行直接插入排序的同时统计在排序过程中对关键字的比较次数和移动次数,并分别输出排序前的数据序列和排序后的数据序列及其统计结果。
下面是我写的部分代码,请帮我看看。
- #include<stdio.h>
- #include <stdlib.h>
- #define MAXSIZE 80 //顺序表的最大长度
- typedef int KeyType; // 将关键字类型定义为整型
- typedef int InfoType; // 将其它数据项类型也定义为整型
- struct
- { int cpn; //记录比较次数
- int mvn; //记录移动次数
- } cm[3]; //分别用来记录三种排序的比较和移动次数,并可将此数组定义为全局变量
- typedef struct{
- KeyType key; // 关键字项
- InfoType otherinfo; // 其它数据项
- }RedType; // 记录类型
- typedef struct{
- RedType r[MAXSIZE+1]; //一般情况将r[0]闲置
- int length; // 顺序表长度
- }SqList; //顺序表的类型
- void zhijiecharu(SqList &L,int n)
- {
- int i,e,j;
- L.r=(RedType)malloc(sizeof(RedType)*MAXSIZE);
- L.length=1;
- for(i=1;i<=n;i++)
- {
- scanf("%d",&L.r[i].key);
- L.length++;
- }
- for(i=1,j=2;j!=L.length;j++)
- {
- if(L.r[i].key>L.r[j].key){
- L.r[0].key=L.r[j].key;
- while(cm[1].cpn++,L.r[i].key>L.r[0].key)
- {
- L.r[i+1].key=L.r[i].key;
- i--;
- cm[1].mvn++;
- }
- L.r[i+1]=L.r[0];
- i=j;
- }
- else
- {
- i++;
- cm[1].cpn++;
- }
- }
- }
复制代码
你的代码有几个问题需要修改:
1. 在定义 `struct` 结构体时,结构体名字缺少了,应该是类似 `struct Counter{...}` 的形式。
2. 定义结构体变量 `cm` 时缺少了结构体名字,应该是 `Counter cm;`。
3. 为了记录比较次数和移动次数,需要在每次比较或移动操作之后,将 `cm.cpn` 或 `cm.mvn` 加一。
4. 在 `zhijiecharu` 函数中,对 `L.r` 进行了动态内存分配,但是没有进行释放。应该在函数结束前加上 `free(L.r);`。
除了上述问题,你的代码基本实现了直接插入排序,并且统计了比较次数和移动次数。
下面是修复后的代码:
- #include <stdio.h>
- #include <stdlib.h>
- #define MAXSIZE 80 //顺序表的最大长度
- typedef int KeyType; // 将关键字类型定义为整型
- typedef int InfoType; // 将其它数据项类型也定义为整型
- struct Counter {
- int cpn; //记录比较次数
- int mvn; //记录移动次数
- }; //分别用来记录三种排序的比较和移动次数,并可将此数组定义为全局变量
- typedef struct {
- KeyType key; // 关键字项
- InfoType otherinfo; // 其它数据项
- } RedType; // 记录类型
- typedef struct {
- RedType *r; //一般情况将r闲置
- int length; // 顺序表长度
- } SqList; //顺序表的类型
- void zhijiecharu(SqList &L, int n)
- {
- int i, j;
- L.r = (RedType*)malloc(sizeof(RedType) * MAXSIZE);
- L.length = 0;
-
- for (i = 1; i <= n; i++) {
- scanf("%d", &(L.r[i].key));
- }
-
- Counter cm = {0, 0}; // 初始化比较次数和移动次数
-
- for (i = 2; i <= n; i++) {
- if (L.r[i].key < L.r[i-1].key) {
- L.r[0] = L.r[i]; // 复制为哨兵
- L.r[i] = L.r[i-1]; // 后移一个元素
- cm.mvn++;
-
- for (j = i-2; L.r[0].key < L.r[j].key; --j) {
- L.r[j+1] = L.r[j];
- cm.mvn++;
- cm.cpn++;
- }
-
- L.r[j+1] = L.r[0]; // 插入到正确位置
- cm.mvn++;
- } else {
- cm.cpn++;
- }
- }
-
- printf("排序前的数据序列:");
- for (i = 1; i <= n; i++) {
- printf("%d ", L.r[i].key);
- }
- printf("\n");
-
- printf("排序后的数据序列:");
- for (i = 1; i <= n; i++) {
- printf("%d ", L.r[i].key);
- }
- printf("\n");
-
- printf("比较次数:%d\n", cm.cpn);
- printf("移动次数:%d\n", cm.mvn);
-
- free(L.r);
- }
复制代码
希望对你有帮助!
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
|
|