常用算法模板库C++.docx
- 文档编号:25624733
- 上传时间:2023-06-10
- 格式:DOCX
- 页数:74
- 大小:28.68KB
常用算法模板库C++.docx
《常用算法模板库C++.docx》由会员分享,可在线阅读,更多相关《常用算法模板库C++.docx(74页珍藏版)》请在冰豆网上搜索。
常用算法模板库C++
1排序算法
1.1冒泡排序
/*
函数功能:
对数组中的某一部分进行冒泡排序。
函数原形:
voidBubSort(DataTypea[],intl,intr,boolUp=true);
参数:
DataTypea[]:
欲排序的数组;
intl:
有序序列在数组中的起始位置;
intr:
有序序列在数组中的结束位置;
boolUp:
true按升序排列,false按降序排列。
返回值:
无。
备注:
无。
*/
template
voidBubSort(DataTypea[],intl,intr,boolUp=true)
{
inti,j;
DataTypek;
if(Up)
{
for(i=l;i<=r-1;i++)
for(j=r;j>=i+1;j--)
if(a[j-1]>a[j])
{
k=a[j-1];
a[j-1]=a[j];
a[j]=k;
}
}
else
for(i=l;i<=r-1;i++)
for(j=r;j>=i+1;j--)
if(a[j-1] { k=a[j-1]; a[j-1]=a[j]; a[j]=k; } } 1.2选择排序 /* 函数功能: 对数组中的某一部分进行选择排序。 函数原形: voidSelectSort(DataTypea[],intl,intr,boolUp=true); 参数: DataTypea[]: 欲排序的数组; intl: 有序序列在数组中的起始位置; intr: 有序序列在数组中的结束位置; boolUp: true按升序排列,false按降序排列。 返回值: 无。 备注: 无。 */ /*普通版*/ template voidSelectSort(DataTypea[],intl,intr,boolUp=true) { inti,j; DataTypek; if(Up) { for(i=l;i<=r-1;i++) for(j=i+1;j<=r;j++) if(a[i]>a[j]) { k=a[i]; a[i]=a[j]; a[j]=k; } } else for(i=l;i<=r-1;i++) for(j=i+1;j<=r;j++) if(a[i] { k=a[i]; a[i]=a[j]; a[j]=k; } } /*优化版*/ template voidSelectSort(DataTypea[],intl,intr,boolUp=true) { inti,j,k; DataTypex; if(Up) { for(i=l;i<=r-1;i++) { k=i; for(j=i+1;j<=r;j++) if(a[j] x=a[i]; a[i]=a[k]; a[k]=x; } } else for(i=l;i<=r-1;i++) { k=i; for(j=i+1;j<=r;j++) if(a[j]>a[k])k=j; x=a[i]; a[i]=a[k]; a[k]=x; } } 1.3插入排序 /* 函数功能: 向有序数组中插如元素,并使插入新元素后仍然有序。 函数原形: voidInsertSort(DataTypes[],int&Count,DataTypex,boolUp=true); 参数: DataTypes[]: 欲插入元素的有序序列; int&Count: 有序序列中现有元素个数; DataTypex: 欲插入的元素; boolUp: true按升序排列,false按降序排列。 返回值: 无。 备注: 无。 */ template voidInsertSort(DataTypes[],int&Count,DataTypex,boolUp=true) { inti,k=-1; if(Up) { for(i=0;i<=Count-1;i++) if(x { k=i; break; } } else for(i=0;i<=Count-1;i++) if(x>s[i]) { k=i; break; } if(k==-1)s[++Count-1]=x; else { for(i=Count-1;i>=k;i--)s[i+1]=s[i]; s[k]=x; Count++; } } 1.4快速排序 /* 函数功能: 对数组中的某一部分进行快速排序。 函数原形: voidQuickSort(DataTypea[],intl,intr,boolUp=true); 参数: DataTypea[]: 欲排序的数组; intl: 有序序列在数组中的起始位置; intr: 有序序列在数组中的结束位置; boolUp: true按升序排列,false按降序排列。 返回值: 无。 备注: 无。 */ template voidQuickSort(DataTypea[],intl,intr,boolUp=true) { inti,j; DataTypeMid,k; i=l; j=r; Mid=a[(l+r)/2]; if(Up) { do { while(a[i] while(Mid if(i<=j) { k=a[i]; a[i]=a[j]; a[j]=k; ++i; --j; } }while(i<=j); } else do { while(a[i]>Mid)++i; while(Mid>a[j])--j; if(i<=j) { k=a[i]; a[i]=a[j]; a[j]=k; ++i; --j; } }while(i<=j); if(i if(l } 1.5哈希排序 /* 函数功能: 对数组中的某一部分进行哈希排序。 函数原形: voidQuickSort(DataTypea[],intl,intr,boolUp=true); 参数: DataTypea[]: 欲排序的数组; intl: 有序序列在数组中的起始位置; intr: 有序序列在数组中的结束位置; boolUp: true按升序排列,false按降序排列。 返回值: 无。 备注: 只能对0~32767范围内的整数排序。 */ voidHashSort(inta[],intl,intr,boolUp=true) { inti,j,k,Hash[32767]={0}; for(i=l;i<=r;i++)Hash[a[i]]++; k=l; if(Up) { for(i=0;i<=32767-1;i++) { for(j=1;j<=Hash[i];j++)a[k++]=i; if(k>r)break; } } else for(i=32767-1;i>=0;i--) { for(j=1;j<=Hash[i];j++)a[k++]=i; if(k>r)break; } } 2数学问题 2.1求最大公约数最小公倍数 /* 函数功能: 求两数的最大公约数。 函数原形: intGCD(intm,intn); 参数: intm,intn: 求这两个数的最大公约数。 返回值: int型,m、n的最大公约数。 备注: 最小公倍数=m*n/GCD(m,n)。 */ intGCD(intm,intn) { intTemp,x,y; x=m; y=n; Temp=x%y; while(Temp! =0) { x=y; y=Temp; Temp=x%y; } returny; } 2.2求素数 2.2.1穷举法 /* 函数功能: 判断一个数是否是素数。 函数原形: boolPrime(intx); 参数: intx: 欲判断的数。 返回值: bool型,返回true表示x是素数,返回false表示x不是素数。 备注: 需包含头文件 */ boolPrime(intx) { inti; x=abs(x); if(x<=1)returnfalse; for(i=2;i<=int(sqrt(float(x)));i++) if(x%i==0)returnfalse; returntrue; } 2.2.2筛法 /* 函数功能: 判断小于等于n的数是否是素数。 函数原形: voidPrime(boolHash[],intn); 参数: boolHash[]: 最终结果,Hash[i]=true表示i是素数,否则表示i不是素数; intn: 判断范围。 返回值: 无。 备注: 无。 */ voidPrime(boolHash[],intn) { inti,k; Hash[0]=false; Hash[1]=false; for(i=2;i<=n;i++)Hash[i]=true; i=2; while(i<=n/2) { k=i; while(k+i<=n) { k=k+i; Hash[k]=false; } i++; while(Hash[i]==false&&i } } 2.3排列组合 2.3.1排列数 /* 函数功能: 排列数公式A(m,n)。 函数原形: intA(intm,intn); 参数: intm,intn: 排列数公式的两个参数。 返回值: int型,排列数。 备注: 无。 */ intA(intm,intn) { inti,Ans; Ans=1; for(i=1;i<=m;i++) { Ans=Ans*n; n--; } returnAns; } 2.3.2组合数 /* 函数功能: 组合数公式C(m,n)。 函数原形: intC(intm,intn); 参数: intm,intn: 组合数公式的两个参数。 返回值: int型,组合数。 备注: 无。 */ intC(intm,intn) { inti,Ans; Ans=1; for(i=1;i<=m;i++) { Ans=Ans*n; n--; } for(i=2;i<=m;i++)Ans=Ans/i; returnAns; } 2.3.3全排列算法 /* 函数功能: 输出n的全排列。 函数原形: voidArrange(intn); 参数: intn: 全排列元素个数。 返回值: 无。 备注: 无。 */ voidSwap(int&a,int&b) { intk; k=a; a=b; b=k; } voidInverse(intNum[],intl,intr) { inti,Count; Count=(r-l+1)/2; for(i=1;i<=Count;i++)Swap(Num[l++],Num[r--]); } voidArrange(intn) { int*Num=newint[n+1]; chari,x,y; Num[0]=0; for(i=1;i<=n;i++)//输出原始序列 { Num[i]=i; cout< } cout<<'\n'; do { for(i=1;i<=n;i++) if(Num[i]>Num[i-1])x=i; for(i=x;i<=n;i++) if(Num[i]>Num[x-1])y=i; if(x>1) { Swap(Num[x-1],Num[y]);//交换Num[x-1]和Num[y] Inverse(Num,x,n);//对num[x]~num[n]作逆序处理 for(i=1;i<=n;i++)cout< cout<<'\n'; } }while(x! =1); delete[]Num; } 2.3.4从n个数中选m个的组合 /* 函数功能: 输出n选m的组合方案。 函数原形: voidCombination(intm,intn); 参数: intm: 欲选出的元素个数; intn: 元素总个数。 返回值: 无。 备注: 无。 */ voidCombination(intm,intn) { int*a=newint[n+1],i,j; a[0]=1; for(i=1;i<=m;i++)a[i]=i; while(a[0]==1) {
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 常用 算法 模板 C+