2022年完整word版,C++常用经典算法及其实现要点 .pdf
《2022年完整word版,C++常用经典算法及其实现要点 .pdf》由会员分享,可在线阅读,更多相关《2022年完整word版,C++常用经典算法及其实现要点 .pdf(22页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、常用算法经典代码(C+ 版)一、快速排序void qsort(int x,int y) /待排序的数据存放在a1.an数组中int h=x,r=y; int m=a(x+y)1; /取中间的那个位置的值while(hr) while (ahm) r-; /比中间那个位置的值大,循环直到找一个比中间那个值小的if(h=r) int temp=ah;/如果此时hx) qsort(x,r);/注意此处,尾指针跑到前半部分了 if(hy) qsort(h,y); /注意此处,头指针跑到后半部分了 调用: qsort(1,n)即可实现数组a 中元素有序。适用于n 比较大的排序二、冒泡排序void pao
2、pao(void) /待排序的数据存放在a1.an数组中for(int i=1;in;i+) / 控制循环(冒泡)的次数,n 个数,需要n-1 次冒泡for(int j=1;j=n-i;j+) /相邻的两两比较if(ajaj+1) int temp=aj;aj=aj+1;aj+1=temp; 或者void paopao(void) /待排序的数据存放在a1.an数组中精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 1 页,共 22 页for(int i=1;i=1;j-) /相邻的两两比较if(ajaj+1) int temp=aj;aj=aj+1
3、;aj+1=temp; 调用: paopao(),适用于n 比较小的排序三、桶排序void bucketsort(void)/a的取值范围已知。如a=cmax 。 memset(tong,0,sizeof(tong);/桶初始化for(int i=1;ia; tonga+;/相应的桶号计数器加1 for(int i=1;i0) /当桶中装的树大于0,说明 i 出现过 tongi 次,否则没出现过i while (tongi!=0) tongi-; couti ; 桶排序适用于那些待排序的关键字的值在已知范围的排序。四、合(归)并排序void merge(int l,int m,int r)/合
4、并 l,m 和m+1,r两个已经有序的区间 int b101;/借助一个新的数组B,使两个有序的子区间合并成一个有序的区间,b 数组的大小要注意精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 2 页,共 22 页int h,t,k; k=0;/用于新数组B 的指针h=l;t=m+1;/让 h 指向第一个区间的第一个元素,t 指向第二个区间的第一个元素。while(h=m)&(t=r)/在指针 h 和 t 没有到区间尾时,把两个区间的元素抄在新数组中k+; / 新数组指针加1 if (ahat)bk=ah;h+; / 抄第一个区间元素到新数组else
5、bk=at;t+; / 抄第二个区间元素到新数组 while(h=m)k+;bk=ah;h+; / 如果第一个区间没有抄结束,把剩下的抄在新数组中while(t=r)k+;bk=at;t+; / 如果第二个区间没有抄结束,把剩下的抄在新数组中for(int o=1;o=y) return; mid=(x+y)/2;/求x,y 区间,中间的那个点mid,mid把 x,y 区间一分为二mergesort(x,mid);/对前一段进行二路归并mergesort(mid+1,y);/对后一段进行二路归并merge(x,mid,y);/把已经有序的前后两段进行合并 归并排序应用了分治思想,把一个大问题,
6、变成两个小问题。二分是分治的思想。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 3 页,共 22 页五、二分查找int find(int x,int y,int m) /在x,y 区间查找关键字等于m 的元素下标 int head,tail,mid; head=x;tail=y;mid=(x+y)/2);/取中间元素下标if(amid=m) return mid;/如果中间元素值为m 返回中间元素下标mid if(headtail) return 0;/如果 xy ,查找失败,返回0 if(mamid) / 如果 m 比中间元素大,在后半区间查找
7、,返回后半区间查找结果return find(mid+1,tail); else / 如果 m 比中间元素小,在前半区间查找,返回后前区间查找结果return find(head,mid-1); 六、高精度加法#include #include using namespace std; int main() string str1,str2; int a250,b250,len; / 数组的大小决定了计算的高精度最大位数int i; memset(a,0,sizeof(a); memset(b,0,sizeof(b); cinstr1str2; / 输入两个字符串a0=str1.length(
8、); / 取得第一个字符串的长度for(i=1;i=a0;i+) / 把第一个字符串转换为整数,存放在数组a 中ai=str1a0-i-0; b0=str2.length(); / 取得第二个字符串长度for(i=1;ib0?a0:b0); / 取两个字符串最大的长度for(i=1;i1) len-; for(i=len;i=1;i-) coutai; return 0; 注意:两个数相加,结果的位数,应该比两个数中大的那个数多一位。七、高精度减法#include using namespace std; int compare(string s1,string s2); int main()
9、 string str1,str2; int a250,b250,len; int i; memset(a,0,sizeof(a); memset(b,0,sizeof(b); 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 5 页,共 22 页cinstr1str2; a0=str1.length(); for(i=1;i=a0;i+) ai=str1a0-i-0; b0=str2.length(); for(i=1;i=b0;i+) bi=str2b0-i-0; if(compare(str1,str2)=0) / 大于等于,做按位减,并处理借
10、位。 for(i=1;i=a0;i+) ai-=bi; if (ai1) a0-; for(i=a0;i=1;i-) coutai; coutendl; else cout-; / 小于就输出负号for(i=1;i=b0;i+) / 做按位减,大的减小的bi-=ai; if (bi1) b0-; 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 6 页,共 22 页for(i=b0;i=1;i-) coutbi; couts2.length() return 0; / 先比较长度,哪个字符串长,对应的那个数就大if(s1.length()s2.len
11、gth() return 1; for(int i=0;is2i) return 0; if(s1is2i) return 1; return 0; / 如果长度相同,每一位也一样,就返回0,说明相等 做减法时,首先要判断两个字符串的大小,决定是否输出负号,然后就是按位减法,注意处理借位。八、高精度乘法#include #include using namespace std; int main() 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 7 页,共 22 页 string str1,str2; int a250,b250,c500,len
12、; /250位以内的两个数相乘int i,j; memset(a,0,sizeof(a); memset(b,0,sizeof(b); cinstr1str2; a0=str1.length(); for(i=1;i=a0;i+) ai=str1a0-i-0; b0=str2.length(); for(i=1;i=b0;i+) bi=str2b0-i-0; memset(c,0,sizeof(c); for(i=1;i=a0;i+) / 做按位乘法同时处理进位,注意循环内语句的写法。for(j=1;j1) len-; / 为什么此处要len1? for(i=len;i=1;i-) coutc
13、i; return 0; 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 8 页,共 22 页注意:两个数相乘,结果的位数应该是这两个数的位数和减1。优化:万进制#include #include using namespace std; void num1(int s,string st1); int a2501,b2501,c5002;/此处可以进行2500 位万进制乘法, 即 10000 位十进制乘法。Int main() string str1,str2; int len; cinstr1str2; memset(a,0,sizeof(a)
14、; memset(b,0,sizeof(b); memset(c,0,sizeof(c); num1(a,str1); /把 str1 从最低位开始,每4 位存放在数组a 中num1(b,str2); /把 str2 从最低位开始,每4 位存放在数组b 中for(int i=1;i=a0;i+) /作按位乘法并处理进位,此处是万进制进位for(int j=1;j1) len-;/去掉高位的0,并输出最高位 cout=1;i-)/把剩下来的每一位还原成4 位输出精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 9 页,共 22 页 if (ci1000
15、) cout 0;if (ci100) cout 0;if (ci10) cout 0;coutci; cout=0;i-) /从最低位开始,处理每一位 if (count%4=0) sk+=(st1i- 0 )*1000; if(i!=0) k+;if (count%4=1) sk=(st1i- 0 );if (count%4=2) sk+=(st1i- 0 )*10;if (count%4=3) sk+=(st1i- 0 )*100;count+; s0=k; /存放数组的位数,就是按4 位处理后的万进制数的位数。Return; 九、高精度除法(没讲)十、筛选法建立素数表void make
16、table(int x)/建立 X 以内的素数表prim ,primi 为 0,表示 i 为素数,为1 表示不是质数精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 10 页,共 22 页 memset(prim,0,sizeof(prim);/初始化质数表 prim0=1;prim1=1;prim2=0;/用筛选法求X 以内的质数表 for(int i=2;i=x;i+) if (primi=0) int j=2*i; while(j=x) primj=1;j=j+i; 对于那些算法中,经常要判断素数的问题,建立一个素数表,可以达到一劳永逸的目的。
17、十一、深度优先搜索void dfs(int x) 以图的深度优先遍历为例。 coutx ; 访问 x 顶点作已访问的标记对与顶点x 相邻而又没访问过的结点k 进行深度优先搜索。if(axk=1)&(visitedk=0) dfs(k); 十二、广度优先搜索void bfs(void) /按广度优先非递归遍历图G,n 个顶点,编号为1.n 。注:图不一定是连通的/ 使用辅助队列Q 和访问标记数组visited 。for(v=1;v=n;v+) visitedv=0;/ 标记数组初始化for(v=1; v=n; v+) 精选学习资料 - - - - - - - - - 名师归纳总结 - - - -
18、 - - -第 11 页,共 22 页if(visitedv=0 ) /v 尚未访问int h=1,r=1; / 置空的辅助队列q visitedv=1;/ 顶点 v,作访问标记coutv ; /访问顶点v qr=v ;/v 入队列while(h=r) /当队列非空时循环 int tmp=qh; / 队头元素出队,并赋值给tmp for(int j=1;j=n;j+) if(visitedj=0)&(atmpj=1) /j为 tmp 的尚未访问的邻接顶点 visitedj=1; 对 j 作访问标记coutj ; 访问 j r+; /队尾指针加1 qr=j; /j入队 /end-if h+; /
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年完整word版 C+常用经典算法及其实现要点 2022 完整 word C+ 常用 经典 算法 及其 实现 要点
限制150内