这个是我们老师自己搭建的一个OJ,没有解答,全是习题。
之前听一个B站的UP主说,学编程,在掌握了基本的语法后,可以通过完成算法题来训练自己,从而进一步提升自己对编程语言掌握的熟练度。所以,趁完成作业的机会,利用OJ来训练自己是一个不错的选择。
题目点击连接可一键直达:
Problemhttp://47.99.179.148/problem.php?id=1002
#include <iostream>
using namespace std;
void swap(int *a, int *b){// 指针a的初值是&a[low], b的初值是&a[high]
int temp = *a;
*a = *b;
*b = temp;
}
void QuickSort(int a[], int n){
int low, high, p, t;
if(n < 2)//只有一个数,不用交换
return;
p = a[n/2]; //基准数p取数组a的中间的数
for(low = 0, high = n-1;; low++, high--){ //从p的两边开始排序
while(p > a[low]) //将小于p的数放在左边,大于p的数放在p的右边
low++;
while(p < a[high])
high--;
if(low >= high) break;
swap(&a[low], &a[high]);// 如果a[low]>p>a[high], 则交换两者, 从而使得左侧的数皆小于p, 右侧的数皆大于p
}
QuickSort(a, low); //第一个递归调用处理数组的前部分,a对应的是数组的首地址,low是指对应的元素个数
QuickSort(a + low, n-low);//第二个递归调用处理数组后部分,a + low指首地址加偏移地址,n-low就是p后面剩下的元素个数
}
int main(){
int m;
cin >> m;
while(m--){
int A[1001];
int n;
cin >> n;
for(int i=0; i<n; i++)
cin >> A[i];
QuickSort(A, n);
cout << A[1] << endl;
}
return 0;
}
当然,在STL中也有关于交换两数值的函数,此处我们也可直接使用。
#include <iostream>
#include <algorithm>
using namespace std;
void QuickSort(int a[], int n){
int low, high, p, t;
if(n < 2)//只有一个数,不用交换
return;
p = a[n/2]; //基准数p取数组a的中间的数
for(low = 0, high = n-1; ; low++, high--){ //从p的两边开始排序
while(p > a[low]) //将小于p的数放在左边,大于p的数放在p的右边
low++;
while(p < a[high])
high--;
if(low >= high) break;
swap(a[low], a[high]);// 如果a[low]>p>a[high], 则交换两者, 从而使得左侧的数皆小于p, 右侧的数皆大于p
}
QuickSort(a, low); //第一个递归调用处理数组的前部分,a对应的是数组的首地址,low是指对应的元素个数
QuickSort(a + low, n-low);//第二个递归调用处理数组后部分,a + low指首地址加偏移地址,n-low就是p后面剩下的元素个数
}
int main(){
int m;
cin >> m;
while(m--){
int A[1001];
int n;
cin >> n;
for(int i=0; i<n; i++)
cin >> A[i];
QuickSort(A, n);
cout << A[1] << endl;
}
return 0;
}
关于快排可参考如下网址:
VisuAlgo - 排序(冒泡排序, 选择排序, 插入排序, 归并排序, 快速排序, 计数排序, 基数排序)https://visualgo.net/zh/sorting