排序和高精度算法总结

:入门阶段的题目刷完了,接下来到了有难度的题目,还有一些复杂的数据结构,希望自己可以坚持下去

1.用迭代求阶乘的方法

int jiechen(int n) {
   
	if (n>1)
	{
   
		return n*jiechen(n - 1);
	}
	return n;
}

2.遇到方向转变的问题,可以用数字来控制方向,num=0是北边,num=1是东边
3.sort(bp+3, bp + n, com);按com定义好的规则进行排序

eg:

bool com(const Bp &a,const Bp &b) {
   
    if (a.bg>b.bg)
    {
   
        return true;
    }
    else
    {
   
        return false;
    }
}

4.整形转字符型+‘0’ 字符型转整形-‘0’

5.高精度加法:

应用场景:如果数据非常大,大到无法用long long这个数据类型存储,就需要用高精度算法来解决。
基本思想:普通的数据类型不够大们就用数组来存储,解决溢出的问题。
-1.定义三个字符数组a,b,分别用来存储两个加数,定义一个temp来存储进位,且初始化为0,定义一个整数数组存储和。
-2.字符数组转换成整数数组A,B。
-3.A[0]是个位,A[1]是十位,以此类推b。(B数组也是如此)
-4.个位相加即A[0]+B[0]+temp(初始化为0不会影响)=C[0],如果有进位(和是两位数),则把进位(和的十位)存储在temp中,个位存储在C[0]。
-5.十位相加即A[0]+B[0]+temp=C[0],如果有进位(和是两位数),则把进位(和的十位)存储在temp中,个位存储在C[0]。
-6.一直加下去,得出结果
https://blog.csdn.net/qq_42702981/article/details/114290183
乘法:https://blog.csdn.net/qq_42702981/article/details/114380214

6. 快速排序算法

void kuaipai(int l,int r) {
   
	int i = l;
	int j = r;
	int mid = v[(l+r)/2];中间数
	do
	{
   
		while (v[i]<mid)//查找左半部分比中间大的数字
		{
   
			i++;
		}
		while (v[j]>mid)//查找右半部分比中间小的数字
		{
   
			j--;
		}
		if (i<=j)//如果有一组不满足条件左小右大,则交换
		{
   
			swap(v[i],v[j]);
			i++;
			j--;
		}

	} while (i<=j);
	if (l<j)//递归处理左边
	{
   
		kuaipai(l,j);
	}
	if (i<r)//递归处理右边
	{
   
		kuaipai(i,r);
	}

}
//调用时
kuaipai(a[0],a[n-1]);//如果是n数组会越界

7.求第k小的数

方法一:对原数组进行快速排序,然后 O(1) 输出

#include<bits/stdc++.h>
using namespace std;
int x[5000005],k;
int main()
{
   
	int n;
	scanf("%d%d",&n,&k);
	for(int i=0;i<n;i++)
		scanf("%d",&x[i]);
	sort(x,x+n);//快排
	printf("%d",x[k]);
}

方法二:STL 里有一个的函数 nth_element
nth_element(a+x,a+

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值