目标
实现一个带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/排序数组