求教数据结构的算法(30分求)
答案:2 悬赏:40 手机版
解决时间 2021-01-18 00:38
- 提问者网友:放下
- 2021-01-17 03:30
求教数据结构的算法(30分求)
最佳答案
- 五星知识达人网友:白昼之月
- 2021-01-17 04:54
void compositor(SqList &list) //排序,采用选择排序
{
student tmp;
for(int i = list.length; i >= 0; i--)
{
int maxpos = i - 1;
for(int j = 0; j < i - 1; j++)
{
if (list.r[j].age > list.r[maxpos].age)
{
maxpos = j;
}
}
tmp = list.r[maxpos];
list.r[maxpos] = list.r[i - 1];
list.r[i - 1] = tmp;
}
}
bool Find(SqList &list, student std,int low ,int high);
int dichotomy(SqList &list, student std)//二分法查找
{
int high,low;
high = list.length - 1;
low = 0;
return Find(list, std, low ,high);
}
int Find(SqList &list, student std,int low ,int high)
{
int mid = (low + high) / 2;
if (low > high)
return -1;
if (list.r[mid].age == std.age)
{
if (strcmp(list.r[mid].name,std.name) == 0) //比较名字,若相等返回
{
return mid;
} else { //名字不相等,可能存在其他同龄人,继续查找
int nReturn = -1;
if ((nReturn = Find(list, std, low ,mid - 1)) != -1)
return nReturn;
else
{
return Find(list, std, mid + 1, high) != -1) ;
}
}
} else if (list.r[mid].age > std.age) {
return Find(list, std, low ,mid - 1);
} else {
return Find(list, std, mid + 1,high);
}
}追问这位高人首先很感谢你能够解答问题,万分感谢,有一些问题就是说,选择排序中的r[maxpos],里的maxpos是需要另外定义的数量长度的是吧?还有一个就是第二个二分查找中能够体现递减的核心语句在哪。。。谢谢了追答不好意思,问题没看太清楚:
1. maxpos不用再定义,只是个中间标识,用于标识当前趟选择到的最大值的位置,然后放置到最后当前序列的最后即可,符合选择排序递增的要素。
2. 递减的情况,修改一下即可:
将语句中的大于号改为小于号即可,如:if (list.r[mid].age < std.age)
具体代码如下所示:
int Find(SqList &list, student std,int low ,int high)
{
int mid = (low + high) / 2;
if (low > high)
return -1;
if (list.r[mid].age == std.age)
{
if (strcmp(list.r[mid].name,std.name) == 0) //比较名字,若相等返回
{
return mid;
} else { //名字不相等,可能存在其他同龄人,继续查找
int nReturn = -1;
if ((nReturn = Find(list, std, low ,mid - 1)) != -1)
return nReturn;
else
{
return Find(list, std, mid + 1, high) != -1) ;
}
}
} else if (list.r[mid].age < std.age) {
return Find(list, std, low ,mid - 1);
} else {
return Find(list, std, mid + 1,high);
}
}
{
student tmp;
for(int i = list.length; i >= 0; i--)
{
int maxpos = i - 1;
for(int j = 0; j < i - 1; j++)
{
if (list.r[j].age > list.r[maxpos].age)
{
maxpos = j;
}
}
tmp = list.r[maxpos];
list.r[maxpos] = list.r[i - 1];
list.r[i - 1] = tmp;
}
}
bool Find(SqList &list, student std,int low ,int high);
int dichotomy(SqList &list, student std)//二分法查找
{
int high,low;
high = list.length - 1;
low = 0;
return Find(list, std, low ,high);
}
int Find(SqList &list, student std,int low ,int high)
{
int mid = (low + high) / 2;
if (low > high)
return -1;
if (list.r[mid].age == std.age)
{
if (strcmp(list.r[mid].name,std.name) == 0) //比较名字,若相等返回
{
return mid;
} else { //名字不相等,可能存在其他同龄人,继续查找
int nReturn = -1;
if ((nReturn = Find(list, std, low ,mid - 1)) != -1)
return nReturn;
else
{
return Find(list, std, mid + 1, high) != -1) ;
}
}
} else if (list.r[mid].age > std.age) {
return Find(list, std, low ,mid - 1);
} else {
return Find(list, std, mid + 1,high);
}
}追问这位高人首先很感谢你能够解答问题,万分感谢,有一些问题就是说,选择排序中的r[maxpos],里的maxpos是需要另外定义的数量长度的是吧?还有一个就是第二个二分查找中能够体现递减的核心语句在哪。。。谢谢了追答不好意思,问题没看太清楚:
1. maxpos不用再定义,只是个中间标识,用于标识当前趟选择到的最大值的位置,然后放置到最后当前序列的最后即可,符合选择排序递增的要素。
2. 递减的情况,修改一下即可:
将语句中的大于号改为小于号即可,如:if (list.r[mid].age < std.age)
具体代码如下所示:
int Find(SqList &list, student std,int low ,int high)
{
int mid = (low + high) / 2;
if (low > high)
return -1;
if (list.r[mid].age == std.age)
{
if (strcmp(list.r[mid].name,std.name) == 0) //比较名字,若相等返回
{
return mid;
} else { //名字不相等,可能存在其他同龄人,继续查找
int nReturn = -1;
if ((nReturn = Find(list, std, low ,mid - 1)) != -1)
return nReturn;
else
{
return Find(list, std, mid + 1, high) != -1) ;
}
}
} else if (list.r[mid].age < std.age) {
return Find(list, std, low ,mid - 1);
} else {
return Find(list, std, mid + 1,high);
}
}
全部回答
- 1楼网友:拾荒鲤
- 2021-01-17 05:35
题目很简单。。。现在没时间,还是帮顶一下吧!
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯