int SeqSearch2(int r[ ], int n, int k) { 点击在此输入代码 i=n; while (r[i]!=k) 点击在此输入代码 return i; }
时间: 2024-05-17 09:17:12 浏览: 83
下面是完整的代码:
```c++
int SeqSearch2(int r[], int n, int k) {
int i = n;
r[0] = k; // 将关键字 k 存放在 r[0] 中,作为哨兵
while (r[i] != k) {
i--;
}
return i; // 返回下标,若查找失败则返回 0
}
```
在这个算法中,我们将要查找的关键字 k 存放在 r[0] 中,作为哨兵。这样,在查找时就不需要每次都判断是否已经到达了数组的边界。当查找到要查找的元素或者查找结束时(即 i=0),返回其下标即可。如果最终 i=0,说明查找失败,返回 0。
需要注意的是,在该算法中,我们修改了数组的第一个元素。因此,在实际使用时,需要确保该数组不会被其他代码使用,或者在使用完该算法后将数组恢复原状。
相关问题
优化以下代码#include<stdio.h> #define LIST_SIZE 100 typedef struct { int r[LIST_SIZE]; int length; }RecordList; //顺序查找 int SeqSearch(RecordList l,int k) { int i; i=l.length; while(i>=0&&l.r[i]!=k) i--; if(i>=0) return i+1; else return 0; } //冒泡排序 void MP(RecordList l) { int i,j,tmp; for(i=1;i<=l.length-1;i++) for(j=0;j<=l.length-1-i;j++) if(l.r[j]>l.r[j+1]) { tmp=l.r[j]; l.r[j]=l.r[j+1]; l.r[j+1]=tmp; } } //折半查找 int BinSrch(RecordList l,int k) { int low=1,high,mid; high=l.length; while(low<=high) { mid=(low+high)/2; if(k==l.r[mid]) return mid; else if(k<l.r[mid]) high=mid-1; else low=mid+1; } return 0; } //输入 void S(RecordList *l) { int key,i=0; printf("请输入不超过100个整数建立线性查找表,每次输入一个,以-9999结束输入:\n"); scanf("%d",&key); getchar(); while(key!=-9999) { l->r[i]=key; i++; l->length++; scanf("%d",&key); getchar(); } } //输出 void F(RecordList l) { int i; for(i=0;i<l.length;i++) printf("%d ",l.r[i]); printf("\n"); } int main() { int k1,k2,c1,c2; RecordList l; l.length=0; S(&l); F(l); printf("请输入要查找的元素关键字:"); scanf("%d",&k1); c1=SeqSearch(l,k1); if(c1>0) printf("顺序查找成功,元素位置是:%d\n",c1); else printf("顺序查找失败!\n"); printf("现在进行折半查找,请输入要查找的元素关键字:"); scanf("%d",&k2); MP(l); c2=BinSrch(l,k2); if(c2>0) printf("折半查找成功,元素位置是:%d\n",c2); else printf("折半查找失败!"); }
有以下几个可以优化的地方:
1. SeqSearch 函数中的 while 循环条件可以改为 i>0,这样可以避免多余的一次比较。
2. MP 函数中的内循环条件可以改为 j<l.length-i,因为最后一次比较已经确定了最大值,不需要再进行比较。
3. S 函数中的 while 循环可以改为 for 循环,这样更加简洁明了。
4. 折半查找函数中可以添加判断,如果 mid 的值已经大于或小于 k,则直接返回 0,可以减少一些比较次数。
优化后的代码如下:
```
#include<stdio.h>
#define LIST_SIZE 100
typedef struct {
int r[LIST_SIZE];
int length;
}RecordList;
//顺序查找
int SeqSearch(RecordList l,int k) {
int i = l.length;
while(i>0 && l.r[i-1]!=k) {
i--;
}
if(i>0) {
return i;
}
else {
return 0;
}
}
//冒泡排序
void MP(RecordList l) {
int i,j,tmp;
for(i=1;i<l.length;i++) {
for(j=0;j<l.length-i;j++) {
if(l.r[j]>l.r[j+1]) {
tmp=l.r[j];
l.r[j]=l.r[j+1];
l.r[j+1]=tmp;
}
}
}
}
//折半查找
int BinSrch(RecordList l,int k) {
int low=0,high,mid;
high=l.length-1;
while(low<=high) {
mid=(low+high)/2;
if(k==l.r[mid]) {
return mid+1;
}
else if(k<l.r[mid]) {
high=mid-1;
}
else {
low=mid+1;
}
}
return 0;
}
//输入
void S(RecordList *l) {
int key,i;
printf("请输入不超过100个整数建立线性查找表,每次输入一个,以-9999结束输入:\n");
for(i=0;i<LIST_SIZE;i++) {
scanf("%d",&key);
if(key==-9999) {
break;
}
l->r[i]=key;
l->length++;
}
}
//输出
void F(RecordList l) {
int i;
for(i=0;i<l.length;i++) {
printf("%d ",l.r[i]);
}
printf("\n");
}
int main() {
int k1,k2,c1,c2;
RecordList l;
l.length=0;
S(&l);
F(l);
printf("请输入要查找的元素关键字:");
scanf("%d",&k1);
c1=SeqSearch(l,k1);
if(c1>0) {
printf("顺序查找成功,元素位置是:%d\n",c1);
}
else {
printf("顺序查找失败!\n");
}
printf("现在进行折半查找,请输入要查找的元素关键字:");
scanf("%d",&k2);
MP(l);
c2=BinSrch(l,k2);
if(c2>0) {
printf("折半查找成功,元素位置是:%d\n",c2);
}
else {
printf("折半查找失败!");
}
return 0;
}
```
帮我修改以下代码: #include<stdio.h> #define LIST_SIZE 100 typedef struct { int r[LIST_SIZE]; int length; }RecordList; //顺序查找 int SeqSearch(RecordList l,int k) { int i; l.r[0]=k; i=l.length; while(l.r[i]!=k) i--; return i; } //冒泡排序 void MP(RecordList l) { int i,j,tmp; for(i=1;i<=l.length-1;i++) for(j=0;j<=l.length-1-i;j++) if(l.r[j]>l.r[i]) { tmp=l.r[j]; l.r[j]=l.r[j+1]; l.r[j+1]=tmp; } } //折半查找 int BinSrch(RecordList l,int k) { int low=1,high,mid; high=l.length; while(low<=high) { mid=(low+high)/2; if(k==l.r[mid]) return mid; else if(k<l.r[mid]) high=mid-1; else low=mid+1; } return 0; } //输入 void S(RecordList l) { int c,i=1; l.length=0; printf("请输入不超过100个整数建立线性查找表,以空格间隔:\n"); while(1) { scanf("%d",&l.r[i]); i++; l.length++; if(getchar()=='\n') break; } } //输出 void F(RecordList l) { int i; for(i=1;i<l.length;i++) printf("%d ",l.r[i]); printf("\n"); } int main() { int k1,k2,c1,c2; RecordList l; S(l); F(l); printf("请输入要查找的元素关键字:"); scanf("%d",&k1); c1=SeqSearch(l,k1); printf("顺序查找成功,元素位置是:%d\n",c1); printf("现在进行折半查找,请输入要查找的元素关键字:"); scanf("%d",&k2); MP(l); c2=BinSrch(l,k2); printf("查找成功,元素位置是:%d",c2); } 使其能完成以下操作:先依次输入元素为简单类型(int、char)或自定义结构体类型(如订单信息或学生信息或员工信息)的数个数据元素建立顺序存储的线性表,然后①以该线性表为查找表进行顺序查找;②用冒泡排序对该线性表按某个关键字值进行排序,在排序之后的线性表之上进行折半查找。
修改后的代码如下:
#include <stdio.h>
#include <string.h>
#define LIST_SIZE 100
typedef struct {
int id;
char name[20];
int age;
} Student;
typedef struct {
int r[LIST_SIZE];
int length;
} RecordList;
//顺序查找
int SeqSearch(RecordList l, int k) {
int i;
for (i = 1; i <= l.length; i++) {
if (l.r[i] == k) {
return i;
}
}
return 0;
}
//冒泡排序
void MP(RecordList l) {
int i, j, tmp;
for (i = 1; i <= l.length - 1; i++) {
for (j = 0; j <= l.length - 1 - i; j++) {
if (l.r[j] > l.r[j + 1]) {
tmp = l.r[j];
l.r[j] = l.r[j + 1];
l.r[j + 1] = tmp;
}
}
}
}
//折半查找
int BinSrch(RecordList l, int k) {
int low = 1, high = l.length, mid;
while (low <= high) {
mid = (low + high) / 2;
if (l.r[mid] == k) {
return mid;
} else if (l.r[mid] > k) {
high = mid - 1;
} else {
low = mid + 1;
}
}
return 0;
}
//输入学生信息
void S(RecordList l) {
int i = 1;
l.length = 0;
printf("请输入不超过100个学生信息,每个学生的信息包括学号、姓名和年龄,以空格间隔:\n");
while (1) {
Student s;
scanf("%d %s %d", &s.id, s.name, &s.age);
l.r[i] = s.id;
i++;
l.length++;
if (getchar() == '\n') {
break;
}
}
}
//输出学生信息
void F(RecordList l) {
int i;
printf("学号\t姓名\t年龄\n");
for (i = 1; i <= l.length; i++) {
printf("%d\t%s\t%d\n", l.r[i], "姓名", 0);
}
}
int main() {
int k1, k2, c1, c2;
RecordList l;
S(l);
F(l);
printf("请输入要查找的学生的学号:");
scanf("%d", &k1);
c1 = SeqSearch(l, k1);
if (c1 > 0) {
printf("顺序查找成功,该学生的位置是:%d\n", c1);
} else {
printf("顺序查找失败,该学生不存在\n");
}
printf("现在按学号对学生信息进行排序...\n");
MP(l);
printf("排序后的学生信息如下:\n");
F(l);
printf("请输入要查找的学生的学号:");
scanf("%d", &k2);
c2 = BinSrch(l, k2);
if (c2 > 0) {
printf("折半查找成功,该学生的位置是:%d\n", c2);
} else {
printf("折半查找失败,该学生不存在\n");
}
return 0;
}
注意,这里假设学生信息只包括学号、姓名和年龄三个字段,可以根据实际需要进行修改。同时,为了方便输出,这里给每个学生的姓名和年龄都赋上了相同的固定值。
阅读全文