[算法与程序设计] 介绍 + 1002

这个是我们老师自己搭建的一个OJ,没有解答,全是习题。

之前听一个B站的UP主说,学编程,在掌握了基本的语法后,可以通过完成算法题来训练自己,从而进一步提升自己对编程语言掌握的熟练度。所以,趁完成作业的机会,利用OJ来训练自己是一个不错的选择。

题目点击连接可一键直达:

Problemicon-default.png?t=LA92http://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 - 排序(冒泡排序, 选择排序, 插入排序, 归并排序, 快速排序, 计数排序, 基数排序)icon-default.png?t=LA92https://visualgo.net/zh/sorting

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值