C++:类对象存储+快排+二分搜索 记录
1. 结构体定义:
2. 快排算法(类对象为行参)
这边我的理解是,
1、找一个参照数据v,设定 l 为右边起始坐标,r 为左边起始坐标。
2、借助一个大的循环体,里面在加两个while循环,一个是从后往前去找比参照数据v小的,另一个从前往后找比参照数据v大的,当执行完两个循环且i!=j,则将上述找到两个数据的位置进行调换。
3、重复第二步操作直到i==j,跳出大循环,并将参照数据与i所代表的中间数据位置,进行调换位置。
4、递归对参照数据v两边进行划分,并重重上述动作,所以调用两次函数。
int partition(Stu stu[], int l, int r) {
int i = l;
int j = r + 1;
int v = stu[l].Tree;
while (true) {
while (stu[--j].Tree > v);
while (i < j && stu[++i].Tree < v);
if (i == j) {
break;
}
std::swap(stu[i], stu[j]);
}
std::swap(stu[i], stu[l]);
return i;
}
void quick_sort(Stu stu[], int l, int r) {
if (l < r) {
int m = partition(stu, l, r);
quick_sort(stu, l, m - 1);
quick_sort(stu, m + 1, r);
}
}
3、二分搜索
int BinarySearch(Stu stu[], int left, int right, int key,int &b) {
int mid = (left + right) / 2; // 待查序列中间位置元素值
b++;
if (left > right) //查找完毕没有找到,返回-1
return -1;
else {
if (stu[mid].Tree == key)
return mid;
else if (stu[mid].Tree > key)
return BinarySearch(stu, left, mid - 1, key,b);
else
return BinarySearch(stu, mid + 1, right, key,b);
}
}
这边我的理解是:针对有序的序列
1、设置待查找序列元素的中间位置 mid,用b 记录查找次数。
2、用left 和right来判断序列大小,如果序列元素个数小于1,直接查找失败
3、设置递归的分界条件:找到。
4、如果没找到,判断当前序列中间元素值与待查找元素值的大小,从而进行序列的选择。
5、调整序列的左右边界也就是left 和right 进行递归。
4、完整代码
#include <iostream>
using namespace std;
class Stu {
public:
string Id;
string Name;
string Major;
int Tree;
public:
Stu(string Id, string Name, string Major, int Tree) {
Id = Id;
Name = Name;
Major = Major;
Tree = Tree;
}
};
int partition(Stu stu[], int l, int r) {
int i = l;
int j = r + 1;
int v = stu[l].Tree;
while (true) {
while (stu[--j].Tree > v);
while (i < j && stu[++i].Tree < v);
if (i == j) {
break;
}
std::swap(stu[i], stu[j]);
}
std::swap(stu[i], stu[l]);
return i;
}
void quick_sort(Stu stu[], int l, int r) {
if (l < r) {
int m = partition(stu, l, r);
quick_sort(stu, l, m - 1);
quick_sort(stu, m + 1, r);
}
}
int BinarySearch(Stu stu[], int left, int right, int key,int &b) {
int mid = (left + right) / 2; // 待查序列中间位置元素值
b++;
if (left > right) //查找完毕没有找到,返回-1
return -1;
else {
if (stu[mid].Tree == key)
return mid;
else if (stu[mid].Tree > key)
return BinarySearch(stu, left, mid - 1, key,b);
else
return BinarySearch(stu, mid + 1, right, key,b);
}
}
int main() {
string Id;
string Name;
string Major;
int Tree;
string n;
int m;
int a;
int b=0;
int count = 0;
Stu stu[6]{
Stu(Id, Name, Major, Tree),
Stu(Id, Name, Major, Tree),
Stu(Id, Name, Major, Tree),
Stu(Id, Name, Major, Tree),
Stu(Id, Name, Major, Tree),
Stu(Id, Name, Major, Tree)
};
for (int i = 0; i < 2; ++i) {
cin >> n;
for (int j = 0; j < 3; ++j) {
if (n == "软件专业:") {
cin >> stu[j].Id >> stu[j].Name >> stu[j].Tree;
stu[j].Major = "软 件";
count++;
}
if (n == "计算机专业:") {
cin >> stu[j + 3].Id >> stu[j + 3].Name >> stu[j + 3].Tree;
stu[j + 3].Major = "计算机";
count--;
}
cout << count << endl;
}
};
cout << "未排序前: " << endl;
for (int i = 0; i < 6; ++i) {
if (i < 3) {
if (i == 0)
cout << "软件专业:" << endl;
cout << stu[i].Id + "\t" << stu[i].Name + "\t" << stu[i].Tree << endl;
} else {
if (i - 3 == 0)
cout << "计算机专业:" << endl;
cout << stu[i].Id + "\t" << stu[i].Name + "\t" << stu[i].Tree << endl;
}
}
quick_sort(stu, 0, 5);
cout << "排序后的输出: 专业" << "\t\t 学号" << "\t\t 姓名" << "\t\t 植树数" << endl;
for (int i = 0; i < 6; ++i) {
cout << "\t\t\t" + stu[i].Major + "\t " << stu[i].Id + "\t\t\t" << stu[i].Name + "\t\t " << stu[i].Tree
<< endl;
}
cout << "要查找的植树数目 ";
cin >> m;
a = BinarySearch(stu, 0, 5, m,b);
cout << "该生排名为第" <<a+1<<"位,"<<"查找"<<b<<"次成功,"<<stu[m+1].Major<<" "<< stu[m+1].Id<<" "<<stu[m+1].Name<<" "<<stu[m+1].Tree;
return 0;
}