标签:i+1 二分 记录 递归 数组 quick head string cst
//program 3-1
#include<iostream>
#include<cstdlib>
#include<algorithm>
using namespace std;
const int M=10000;
int x,n,i;
int s[M];
int BinarySearch(int n,int s[],int x)
{
int low=0,high=n-1; //low指向有序数组的第一个元素,high指向有序数组的最后一个元素
while(low<=high)
{
int middle=(low+high)/2; //middle为查找范围的中间值
if(x==s[middle]) //x等于查找范围的中间值,算法结束
return middle;
else if(x>s[middle]) //x大于查找范围的中间元素,则从左半部分查找
low=middle+1;
else //x小于查找范围的中间元素,则从右半部分查找
high=middle-1;
}
return -1;
}
int main()
{
cout<<"该数列中的元素个数n为:";
while(cin>>n)
{
cout<<"请依次输入数列中的元素:";
for(i=0;i<n;i++)
cin>>s[i];
sort(s,s+n);
cout<<"排序后的数组为:";
for(i=0;i<n;i++)
{
cout<<s[i]<<" ";
}
cout<<endl;
cout<<"请输入要查找的元素:";
cin>>x;
i=BinarySearch(n,s,x);
if(i==-1)
cout<<"该数列中没有要查找的元素"<<endl;
else
cout<<"要查找的元素在第"<<i+1<<"位"<<endl;
}
return 0;
}
//program 3-2
#include <iostream>
#include <cstdlib>
using namespace std;
void Merge(int A[], int low, int mid, int high)
{
int *B=new int[high-low+1];//申请一个辅助数组
int i=low, j=mid+1, k=0;
while(i<=mid && j<=high) {//按从小到大存放到辅助数组B[]中
if(A[i]<=A[j])
B[k++]=A[i++];
else
B[k++]=A[j++];
}
while(i<=mid) B[k++]=A[i++];//将数组中剩下的元素放置B中
while(j<=high) B[k++]=A[j++];
for(i=low, k=0; i<=high; i++)
A[i]=B[k++];
}
void MergeSort(int A[], int low, int high)
{
if(low<high)
{
int mid=(low+high)/2;//取中点
MergeSort(A, low, mid);//对A[low:mid]中的元素合并排序
MergeSort(A, mid+1, high);//对A[mid+1:high]中的元素合并排序
Merge(A, low, mid, high);//合并
}
}
int main()
{
int n, A[100];
cout<<"请输入数列中的元素个数n为:"<<endl;
cin>>n;
cout<<"请依次输入数列中的元素:"<<endl;
for(int i=0; i<n; i++)
cin>>A[i];
MergeSort(A,0,n-1);
cout<<"合并排序结果:"<<endl;
for(int i=0;i<n;i++)
cout<<A[i]<<" ";
cout<<endl;
return 0;
}
//program 3-3
#include <iostream>
using namespace std;
int Partition(int r[],int low,int high)//划分函数
{
int i=low,j=high,pivot=r[low];//基准元素
while(i<j)
{
while(i<j&&r[j]>pivot) j--;//向左扫描
if(i<j)
{
swap(r[i++],r[j]);//r[i]和r[j]交换后i+1右移一位
}
while(i<j&&r[i]<=pivot) i++;//向右扫描
if(i<j)
{
swap(r[i],r[j--]);//r[i]和r[j]交换 后j-1左移一位
}
}
return i;//返回最终划分完成后基准元素所在的位置
}
int Partition2(int r[],int low,int high)//划分函数
{
int i=low,j=high,pivot=r[low];//基准元素
while(i<j)
{
while(i<j&&r[j]>pivot) j--;//向左扫描
while(i<j&&r[i]<=pivot) i++;//向右扫描
if(i<j)
{
swap(r[i++],r[j--]);//r[i]和r[j]交换
}
}
if(r[i]>pivot)
{
swap(r[i-1],r[low]);//r[i-1]和r[low]交换
return i-1;//返回最终划分完成后基准元素所在的位置
}
swap(r[i],r[low]);//r[i]和r[low]交换
return i;//返回最终划分完成后基准元素所在的位置
}
void QuickSort(int R[],int low,int high)//实现快排算法
{
int mid;
if(low<high)
{
mid=Partition2(R,low,high); //基准位置
QuickSort(R,low,mid-1);//左区间递归快排
QuickSort(R,mid+1,high);//右区间递归快排
}
}
int main()
{
int a[100];
int i,N;
cout<<"请先输入要排序的数据的个数:";
cin>>N;
cout<<"请输入要排序的数据:";
for(i=0;i<N;i++)
cin>>a[i];
cout<<endl;
QuickSort(a,0,N-1);
cout<<"排序后的序列为:"<<endl;
for(i=0;i<N;i++)
cout<<a[i]<<" " ;
cout<<endl;
return 0;
}
//program 3-4
#include <stdlib.h>
#include <cstring>
#include <iostream>
using namespace std;
#define M 100
char sa[1000];
char sb[1000];
typedef struct _Node
{
int s[M];
int l; //代表字符串的长度
int c;
} Node,*pNode;
void cp(pNode src, pNode des, int st, int l)
{
int i, j;
for(i=st, j=0; i<st+l; i++, j++)
{
des->s[j] = src->s[i];
}
des->l = l;
des->c = st + src->c; //次幂
}
/*
分治法 大数乘法
X = A*10^n + B
Y = C*10^m + D
X*Y = A*C*10^(n+m) + A*D*10^n + B*C*10^m + B*D
*/
void add(pNode pa, pNode pb, pNode ans)
{
int i,cc,k,palen,pblen,len;
int ta, tb;
pNode temp;
if((pa->c<pb->c)) //保证Pa的次幂大
{
temp = pa;
pa = pb;
pb = temp;
}
ans->c = pb->c;
cc = 0;
palen=pa->l + pa->c;
pblen=pb->l + pb->c;
if(palen>pblen)
len=palen;
else
len=pblen;
k=pa->c - pb->c;
for(i=0; i<len-ans->c; i++) //结果的长度最长为pa,pb之中的最大长度减去最低次幂
{
if(i<k)
ta = 0;
else
ta = pa->s[i-k];//次幂高的补0,大于低的长度后与0进行计算
if(i<pb->l)
tb = pb->s[i];
else
tb = 0;
if(i>=pa->l+k)
ta = 0;
ans->s[i] = (ta + tb + cc)%10;
cc = (ta + tb + cc)/10;
}
if(cc)
ans->s[i++] = cc;
ans->l = i;
}
void mul(pNode pa, pNode pb, pNode ans)
{
int i, cc, w;
int ma = pa->l>>1, mb = pb->l>>1; //长度除2
Node ah, al, bh, bl;
Node t1, t2, t3, t4, z;
pNode temp;
if(!ma || !mb) //如果其中个数为1
{
if(!ma) //如果a串的长度为1,pa,pb交换,pa的长度大于等于pb的长度
{
temp = pa;
pa = pb;
pb = temp;
}
ans->c = pa->c + pb->c;
w = pb->s[0];
cc = 0; //此时的进位为c
for(i=0; i < pa->l; i++)
{
ans->s[i] = (w*pa->s[i] + cc)%10;
cc= (w*pa->s[i] + cc)/10;
}
if(cc)
ans->s[i++] = cc; //如果到最后还有进位,则存入结果
ans->l = i; //记录结果的长度
return;
}
//分治的核心
cp(pa, &ah, ma, pa->l-ma); //先分成4部分al,ah,bl,bh
cp(pa, &al, 0, ma);
cp(pb, &bh, mb, pb->l-mb);
cp(pb, &bl, 0, mb);
mul(&ah, &bh, &t1); //分成4部分相乘
mul(&ah, &bl, &t2);
mul(&al, &bh, &t3);
mul(&al, &bl, &t4);
add(&t3, &t4, ans);
add(&t2, ans, &z);
add(&t1, &z, ans);
}
int main()
{
Node ans,a,b;
cout << "输入大整数 a:"<<endl;
cin >> sa;
cout << "输入大整数 b:"<<endl;
cin >> sb;
a.l=strlen(sa);//sa,sb以字符串进行处理
b.l=strlen(sb);
int z=0,i;
for(i = a.l-1; i >= 0; i--)
a.s[z++]=sa[i]-‘0‘; //倒向存储
a.c=0;
z=0;
for(i = b.l-1; i >= 0; i--)
b.s[z++] = sb[i]-‘0‘;
b.c = 0;
mul(&a, &b, &ans);
cout << "最终结果为:";
for(i = ans.l-1; i >= 0; i--)
cout << ans.s[i]; //ans用来存储结果,倒向存储
cout << endl;
return 0;
}
//program 3-4-1
#include <stdlib.h>
#include <cstring>
#include <iostream>
using namespace std;
#define M 100
char sa[1000];
char sb[1000];
typedef struct _Node
{
int s[M];
int l; //代表字符串的长度
int c;
} Node,*pNode;
void add(pNode pa, pNode pb, pNode ans)
{
int i,cc,k,palen,pblen,len;
int ta, tb;
pNode temp;
if((pa->c<pb->c)) //保证Pa的次幂大
{
temp = pa;
pa = pb;
pb = temp;
}
ans->c = pb->c;
cc = 0;
k=pa->c - pb->c;
palen=pa->l + pa->c;
pblen=pb->l + pb->c;
if(palen>pblen)
len=palen;
else
len=pblen;
len=len-ans->c;
for(i=0; i<len; i++) //结果的长度最长为pa,pb之中的最大长度减去最低次幂
{
if(i<k)
ta = 0;
else
ta = pa->s[i-k];//次幂高的补0,大于低的长度后与0进行计算
if(i<pb->l)
tb = pb->s[i];
else
tb = 0;
if(i>=pa->l+k)
ta = 0;
ans->s[i] = (ta + tb + cc)%10;
cc = (ta + tb + cc)/10;
}
if(cc)
ans->s[i++] = cc;
ans->l = i;
}
int main()
{
Node ans,a,b;//ans用来存储结果,倒向存储
cout << "输入大整数 a:"<<endl;
cin >> sa;
cout << "输入大整数 a的次幂:"<<endl;
cin >> a.c;
cout << "输入大整数 b:"<<endl;
cin >> sb;
cout << "输入大整数 b的次幂:"<<endl;
cin >> b.c;
a.l=strlen(sa);//sa,sb以字符串进行处理
b.l=strlen(sb);
int z=0,i;
for(i = a.l-1; i >= 0; i--)
a.s[z++]=sa[i]-‘0‘; //倒向存储
z=0;
for(i = b.l-1; i >= 0; i--)
b.s[z++] = sb[i]-‘0‘;
cout << "a=";
for(i = a.l-1; i >= 0; i--)
cout << a.s[i];
cout << "*10^"<<a.c;
cout << endl;
cout << "b=";
for(i = b.l-1; i >= 0; i--)
cout << b.s[i];
cout << "*10^"<<b.c;
cout << endl;
add(&a, &b, &ans);
cout << "最终结果为:";
for(i = ans.l-1; i>=0; i--)
cout << ans.s[i]; //ans用来存储结果,倒向存储
cout << "*10^"<<ans.c;
cout<<endl;
return 0;
}
标签:i+1 二分 记录 递归 数组 quick head string cst
原文地址:https://www.cnblogs.com/self-confidence/p/13604551.html