别人的代码整理

小TIPS:
1.本篇精华部分全是转载,原题与原代码网址已全部贴上
2.部分代码有所改动,不确定有无改错,正解请看贴上的原网址
3.代码部分//为原代码注解。/**/为本人自己加上的注解,本人注解可以忽略
4.PS部分为本人自己的心得体会,可以忽略
3.下面的废话可以忽略,直接从目录开始看即可

废话:

今天是2021.1.24,我过几个月就要参加蓝桥杯比赛了,大一上我只学了c语言语法,感觉自己基础好差,比不过大二大三的同学,但我入围了学校的初选可以免报名费参加,所以只能硬着头皮上了。

现在正在0基础补算法ing,去洛谷刷了几道题,我发现有些大神的思路好棒,想摘抄下来给大家分享。有些地方我照着自己的理解作了一些修改和注解,但考虑到本小菜鸡可能会因为理解不到位而改错以至于误导各位小伙伴,我把题目和代码的网址都贴在对应的地方了,疏漏之处欢迎大家指正。

排序

快速排序

题目:https://www.luogu.com.cn/problem/P1177

利用快速排序算法将读入的 N 个数从小到大排序后输出。

快速排序是信息学竞赛的必备算法之一。对于快速排序不是很了解的同学可以自行上网查询相关资料,掌握后独立完成。(C++ 选手请不要试图使用
STL,虽然你可以使用 sort 一遍过,但是你并没有掌握快速排序算法的精髓。)
输入格式
第 1 行为一个正整数 N,第 2 行包含 N 个空格隔开的正整数 ai ,为你需要进行排序的数,数据保证了 Ai不超过 109
输出格式
将给定的 N 个数从小到大输出,数之间空格隔开,行末换行且无空格。
样例
输入 #1

5
4 2 4 5 1

输出 #1

1 2 4 4 5

代码(c++):https://www.luogu.com.cn/blog/86005/solution-p1177

#include <iostream>
using namespace std;
int n,a[100001];
void quicksort(int left,int right)
{
    int mid=a[(left+right)/2];/*优化1*/
	int i=left,j=right;	
	while(i<j)
	{
		while(a[i]<mid) i++;//查找左半部分比中间数大的数  /*易错2*/
        while(a[j]>mid) j--;//查找右半部分比中间数小的数	
		if (i<=j)//如果有一组不满足排序条件(左小右大)的数  /*优化3*/
		{			
			swap(a[i],a[j]);//交换    /*心得4*/   
			i++;           
			j--;
		}		
	}
	if (left<j) quicksort(left,j);     /*优化3*/
	if (i<right) quicksort(i,right);	
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];    /*优化5*/
    quicksort(1,n);
    for(int i=1;i<=n-1;i++) cout<<a[i]<<" ";
    cout<<a[n]<<"\n";
    return 0;
}

PS:

  • 优化1:快速排序的基准数是最左边的,而且一定要从右边开始找数,把某些已经有序的数组用更复杂的方式排列,以中间为基准其实更好。
  • 易错2:把<写成<=,如果中间的数为最大值,会造成死循环
  • 优化3:i<=j 和 i++,j-- 和 if (left<j),if (i<right)环环相扣,减少了不必要的循环和判断,不看代码自己写一遍就可以体会到这种巧妙。
  • 心得4:我之前交换数一直都是a=b;b=c;c=a;以后交换数就用swap了
  • 优化5:计算方式最少的循环,我刚开始想的是for(int i=0;i<n;i++),那么就会多出cout<<a[n-1]<<"\n"和 quicksort(0,n-1); 这两个关于n的计算。

我觉得这个代码比官方的题解还要简单,速度也更快。不过这题的限制条件我觉得还是有点过于苛刻了,用快速排序法会超时,我觉得出这题的目的应该是想告诉我们快速排序法也有缺点吧,不过到比赛的时候还是快速排序法比较省做题时间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值