week2

梦想不抛弃苦心追求的人,只要不停止追求,你们会沐浴在梦想的光辉之中。再美好的梦想与目标,再完美的计划和方案,如果不能尽快在行动中落实,最终只能是纸上谈兵,空想一番。只要瞄准了大方向,坚持不懈地做下去,才能够扫除挡在梦想前面的障碍,实现美好的人生蓝图。week2,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

快速排序

参照《算法导论》

快排采用分治思想:

  1. 分解
    数组A[p…r]被分为两个子数组A[p…q-1]和A[q+1…r],使得A[p…q-1]中的每一个元素都小于等于A[q],A[q+1…r]中的每一个元素都大于等于A[q]
  2. 解决
    通过递归,对子数组A[p…q-1]和A[q+1…r]进行排序
  3. 合并
    子数组都是原址排序,所以不需要合并操作:A[p…r]已经有序
QUICKSORT(A,p,r)
if p<r
	q=PARTITION(A,p,r)
	QUICKSORT(A,p,q-1)
	QUICKSORT(A,q+1,r)

PARTITION的实现

PARTITION(A,p,r)
x=A[r]	//始终将最右边的元素作为主元,围绕它来划分子数组
i=p-1	//i标记左界
for j=p to r-1	//j标记右界
	if(A[j]<=x)
		i=i+1
		exchange A[i] with A[j]	//这样保证i、j之间(i右侧至j左侧)的数始终大于x,便于维护子数组性质
exchange A[i+1] with A[r]	//此时最中间的数为主元
return i+1	//找到了q的位置	

代码实现

#include<bits/stdc++.h>
using namespace std;
void exchange(int *a,int *b){
	int tmp;
	tmp=*a;
	*a=*b;
	*b=tmp;
}
int PARTITION(int n[],int l,int r){
		int i=l-1;
		for(int j=l;j<=r-1;j++){
			if(n[j]<=n[r]){
				i++;
				exchange(&n[j],&n[i]);
			}
		}
		exchange(&n[i+1],&n[r]);
		return i+1;
}
void QUICKSORT(int n[],int l,int r){
	if(l<r){
		int m=PARTITION(n,l,r);
		QUICKSORT(n,l,m-1);
		QUICKSORT(n,m+1,r);
	}
}
int main(){
	freopen("input.txt","r",stdin);
	int n[10086],f=1;
	while(~scanf("%d",&n[f]))
		f++;
	QUICKSORT(n,1,f-1);
	while((f--)&&(f>=1))
		cout<<n[f]<<'\0';
	return 0;
}

访问属性

  1. public 类外可访问、修改
  2. private 不能类外访问、修改

class pair{
	public :
		int can;
	private :
		int cannot;
};
int main(){
	pair a;
	a.can=2;	//可以(can是public)
	a.cannot=2;	//不行(cannot是private)
	return 0;
}

成员函数

通过使用类里面定义的函数,可以修改private成员

#include<bits/stdc++.h>
using namespace std;
class ex{
	private:
		int n=1;
	public:
		int gtn(void){
			return n;
		}
		void plus(int a,int b){
			n=a+b;
		}
}num;
int main(){
	cout<<num.gtn()<<endl;
	num.plus(2,1);
	cout<<num.gtn();
	return 0;
}

输出结果

1
3

友元函数

使类外函数也能访问、修改private成员
使用关键字friend

#include<bits/stdc++.h>
using namespace std;
class exm{
	public :
		friend int getn(void);
	private :
		int n=4;
}nu;
int getn(void){
	return nu.n;
}
int main(){
	cout<<getn();
	return 0;
}

输出结果

4

重载运算符

operator运算符名

如重载+

#include<bits/stdc++.h>
using namespace std;
class cls{
	private :
		int tot;
	public :
		friend int operator+(cls a,cls b);
		int getnumb(void){
			return tot;
		}
		void input(int n){
			tot=n;
		}
}numb_1,numb_2,numb_3;
int operator+(cls a,cls b){
	return a.getnumb()+b.getnumb();
}
int main(){
	numb_2.input(20);
	numb_3.input(30);
	numb_1.input(numb_2+numb_3);
	cout<<numb_1.getnumb();
	return 0;
}

输出结果

50

高精度计算

原理:将数字以字符串形式读入,逢10进1(模拟竖式计算)。数字0 ~ 9对应的ASCII值为48 ~ 57,计算时将该位字符 -‘0’ 即 -48 即可将字符转化为数字进行计算。

#include<bits/stdc++.h>
using namespace std;
int len1,len2;
class gj{
	private:
		int i,x;
	public:
		int n[10086];
		void cal_1(gj a,gj b){
			i=0,x=0;
    		while( i<=len1 || i<=len2 ){
        		n[i]=a.n[i]+b.n[i]+x;
        		x=n[i]/10;
        		n[i]%=10;
        		i++;
    		}
    		n[i]=x;
    		while(n[i]==0 && i!=0) i--;
		}
		void output(void){
			for (int j=i;j>=0;j--){
        		printf("%d",n[j]);
    		}
    		printf("\n");
		}
}n1,n2,as;
string js1,js2;
int main(){
	cin>>js1>>js2;
	len1=js1.size(),len2=js2.size();
	for (int i=len1-1,j=0;i>=0;i--,j++)
    {
        n1.n[j]=js1[i]-'0';
    }
    for (int i=len2-1,j=0;i>=0;i--,j++)
    {
        n2.n[j]=js2[i]-'0';
    }
    as.cal_1(n1,n2);
    as.output();
	return 0;
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之家整理,本文链接:https://www.bmabk.com/index.php/post/150998.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之家——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!