[Qt5学习·三]随机数生成、排序、奇偶分类

目标

实现一个带UI的随机数生成、排序、奇偶分类解决项目:
1、生成按钮:随机生成任意个不同数字并显示在界面;
2、排序按钮:对随机生成的任意个数进行排序,用 “,”隔开;
3、分类按钮:将十个数奇偶分类,并显示;

代码

widget.h

#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QLineEdit>
#include <vector>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT
public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
private slots:
    void on_Generator_clicked();
    void on_sort_clicked();
    void on_oe_sort_clicked();
private:
    Ui::Widget *ui;
    QLineEdit display;
    std::vector<int> rdvec;
    QString str;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include "QDebug"
#include "QMessageBox"
#include "quicksort.h"
#include "QString"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
}

Widget::~Widget()
{
    delete ui;
}
QString vectoQstring (std::vector<int> vec);

void Widget::on_Generator_clicked()
{
    rdvec.clear();
    for(int i=0;i<10;i++){
        rdvec.push_back(rand()%100);//生成1-100的随机数
    }
    str = vectoQstring(rdvec);
    ui->display->setText(str);
}

QString vectoQstring (std::vector<int> vec){
	//vec<int>转QString
    int size=vec.size();
    QString str;
    for(int i=0;i<size;i++){
        str+=QString::number(vec[i]);
        str+=",";
    }
    str.chop(1); //把最后一个","删掉
    return str;
}

void Widget::on_sort_clicked()
{
	//排序按钮
    int size=rdvec.size();
    if( size== 0 ){
        QMessageBox::warning(this,"错误","未生成数组");
        return;
    }
    quicksort qsort;
    qsort.randomized_quicksort(rdvec,0,size);
    str = vectoQstring(rdvec);
    ui->display->setText(str);
}

void Widget::on_oe_sort_clicked()
{
	//奇偶分类按钮
    int size=rdvec.size();
    if( size== 0 ){
        QMessageBox::warning(this,"错误","未生成数组");
        return;
    }
    //定义有关变量
    quicksort qsort;
    std::vector<std::vector<int>> vec_oe;
    QString even_str,odd_str;
    vec_oe=qsort.odd_even_sort(rdvec);
    even_str=vectoQstring(vec_oe[0]);
    odd_str=vectoQstring(vec_oe[1]);
    ui->display->setText("奇数:"+odd_str+"\n"+"偶数:"+even_str);
}

quicksort.h

#ifndef QUICKSORT_H
#define QUICKSORT_H
#include <vector>
#include <QString>
using namespace  std;

class quicksort{
public:
    quicksort();
    void randomized_quicksort(vector<int>& nums, int l, int r);
    vector<vector<int>> odd_even_sort(vector<int>& nums);
    ~quicksort();
private:
    int partition(vector<int>& nums, int l, int r);
    int randomized_partition(vector<int>& nums, int l, int r);
};
#endif // QUICKSORT_H

quicksort.cpp

#include "quicksort.h"
#include "stdlib.h"

quicksort::quicksort(){

}
quicksort::~quicksort(){

}
int quicksort::partition(vector<int>& nums, int l, int r) {
    int pivot = nums[r];
    int i = l - 1;
    for (int j = l; j <= r - 1; ++j) {
        if (nums[j] <= pivot) {
            i = i + 1;
            swap(nums[i], nums[j]);
        }
    }
    swap(nums[i + 1], nums[r]);
    return i + 1;
}
int quicksort::randomized_partition(vector<int>& nums, int l, int r) {
    int i = rand()%(r - l + 1) + l; // 随机选一个作为我们的主元
    swap(nums[r], nums[i]);
    return partition(nums, l, r);
}
void quicksort::randomized_quicksort(vector<int>& nums, int l, int r) {
    if (l < r) {
        int pos = randomized_partition(nums, l, r);
        randomized_quicksort(nums, l, pos - 1);
        randomized_quicksort(nums, pos + 1, r);
    }
}

vector<vector<int>> quicksort::odd_even_sort(vector<int>& nums){
    vector<vector<int>> vec_oe;
    vector<int> even,odd;
    int size = nums.size();
    for(int i=0;i<size;i++){
    	//奇偶分类
        (nums[i] % 2 ==0) ? even.push_back(nums[i]) : odd.push_back(nums[i]); 
    }
    vec_oe.push_back(odd);
    vec_oe.push_back(even);
    return vec_oe;
}

main.cpp

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}

参考资料

1、快速排序参考的是

https://leetcode.cn/problems/sort-an-array/排序数组

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值