算法笔记 -归并排序 快速幂
1.归并排序
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include <vector>
#include <set>
#include <cmath>
#include<ctime>
using namespace std;
typedef long long ll;
const double eps = 1e-5;
const double PI = acos(-1.0);
const int maxn=100;
int a[]={66,12,33,57,64,27,18};
int b[]={66,12,33,57,64,27,18};
int n=0;
// 序列合并问题模板
void merge(int A[],int l1,int r1,int l2,int r2){
int i=l1,j=l2;
int temp[maxn],index=0;
while(i<=r1&&j<=r2){ // =
if(A[i]<=A[j]){
temp[index++]=A[i++];
}else{
temp[index++]=A[j++];
}
}
while(i<=r1) temp[index++]=A[i++]; // =
while(j<=r2) temp[index++]=A[j++]; // =
for(i=0;i<index;i++){
A[l1+i]=temp[i];
}
}
// 递归法 二路归并排序
void mergesort_recursion(int a[],int left,int right){
if(left<right){ //只要left小于right
int mid=(left+right)/2; //取[left,right]的中点
mergesort_recursion(a,left,mid); //递归,将左子区间[left,mid]归并排序
mergesort_recursion(a,mid+1,right); //递归,将右子区间[mid+1,right]归并排序
merge(a,left,mid,mid+1,right); //将左右区间合并
}
}
// 迭代法 二路归并排序
void mergesort_iteration(int a[]){
for(int step=2;step/2<=n;step*=2){
for(int i=0;i<n;i+=step){
int mid=i+step/2;
if(mid+1<=n){
merge(a,i,mid-1,mid,min(i+step-1,n-1));
}
}
for(int i=0;i<n;i++){
cout<<a[i]<<" ";
}
cout<<endl;
}
}
int main(){
//加快cin cout 时间
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
n=sizeof(a) / sizeof(a[0]);
cout<<"迭代法二路归并"<<endl;
mergesort_iteration(a);
cout<<"递归法二路归并"<<endl;
mergesort_recursion(b,0,n-1);
for(int i=0;i<n;i++){
cout<<b[i]<<" ";
}
cout<<endl;
cout << "The run time is: " <<(double)clock() / CLOCKS_PER_SEC << "s" << endl;
return 0;
}
2.快速幂
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<string>
#include <vector>
#include <set>
#include <cmath>
#include<ctime>
using namespace std;
typedef long long ll;
const double eps = 1e-5;
const double PI = acos(-1.0);
// 快速幂的递归写法 时间慢
ll binaryPow_recursion(ll a,ll b,ll m){
if(b==0)
return 1;
if(b&1){
return a*binaryPow_recursion(a,b-1,m)%m;
}
else{
ll mu1=binaryPow_recursion(a,b/2,m);
return mu1*mu1%m;
}
}
// 快速幂的迭代写法 时间快
ll binaryPow_iteration(ll a,ll b,ll m){
ll ans=1;
while(b>0){
if(b&1){
ans*=a%m;
}
a=a*a%m;
b>>=1;
}
return ans;
}
int main(){
//加快cin cout 时间
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cout<<binaryPow_recursion(2,10,1025)<<endl;
cout<<binaryPow_iteration(2,10,1025)<<endl;
// 输出运行时间
cout << "The run time is: " <<(double)clock() / CLOCKS_PER_SEC << "s" << endl;
return 0;
}
递归比迭代要耗时,数据量大时可能会超时,洛谷上会TLE,建议用迭代法