C++:类对象存储+快排+二分搜索 记录学习

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值