2022年完整word版,C++常用经典算法及其实现要点.docx
《2022年完整word版,C++常用经典算法及其实现要点.docx》由会员分享,可在线阅读,更多相关《2022年完整word版,C++常用经典算法及其实现要点.docx(36页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选学习资料 - - - - - - - - - 常用算法经典代码(C+ 版)一、快速排序void qsortint x,int y /待排序的数据存放在a1.an数组中int h=x,r=y; int m=ax+y1; / 取中间的那个位置的值whilehr while ahm r-; / 比中间那个位置的值大,循环直到找一个比中间那个值小的ifh=r int temp=ah;/ 假如此时 hx qsortx,r;/ 留意此处,尾指针跑到前半部分了 ifhy qsorth,y; / 留意此处,头指针跑到后半部分了 调用: qsort1,n即可实现数组a 中元素有序;适用于n 比较大的排序二、
2、冒泡排序void paopaovoid /待排序的数据存放在a1.an数组中n-1 次冒泡forint i=1;in;i+ / 掌握循环(冒泡)的次数,n 个数,需要forint j=1;j=n-i;j+ /相邻的两两比较ifajaj+1 int temp=aj;aj=aj+1;aj+1=temp; 或者名师归纳总结 void paopaovoid /待排序的数据存放在a1.an数组中第 1 页,共 22 页- - - - - - -精选学习资料 - - - - - - - - - forint i=1;i=1;j- / 相邻的两两比较ifajaj+1 int temp=aj;aj=aj+1;
3、aj+1=temp; 调用: paopao,适用于n 比较小的排序三、桶排序void bucketsortvoid/a 的取值范畴已知;如 a=cmax ; memsettong,0,sizeoftong;/ 桶初始化forint i=1;ia; tonga+;/相应的桶号计数器加1 forint i=1;i0 /当桶中装的树大于0,说明 i 显现过 tongi 次,否就没显现过i while tongi.=0 tongi-; couti; 桶排序适用于那些待排序的关键字的值在已知范畴的排序;四、合(归)并排序void mergeint l,int m,int r/ 合并 l,m 和m+1,r
4、 两个已经有序的区间 int b101;/ 借助一个新的数组 B,使两个有序的子区间合并成一个有序的区间,b 数组的大小要留意名师归纳总结 - - - - - - -第 2 页,共 22 页精选学习资料 - - - - - - - - - int h,t,k; k=0;/ 用于新数组 B 的指针h=l;t=m+1;/ 让 h 指向第一个区间的第一个元素,t 指向其次个区间的第一个元素;whileh=m&t=r/ 中在指针 h 和 t 没有到区间尾时,把两个区间的元素抄在新数组k+; / 新数组指针加1 if ahatbk=ah;h+; / 抄第一个区间元素到新数组elsebk=at;t+; /
5、 抄其次个区间元素到新数组 whileh=mk+;bk=ah;h+; 组中/ 假如第一个区间没有抄终止,把剩下的抄在新数whilet=rk+;bk=at;t+; / 假如其次个区间没有抄终止,把剩下的抄在新数组中forint o=1;o=y return; 对区间 x,y 进行二路归并排序mid=x+y/2;/ 求x,y 区间,中间的那个点 mid,mid 把 x,y 区间一分为二mergesortx,mid;/ 对前一段进行二路归并mergesortmid+1,y;/ 对后一段进行二路归并mergex,mid,y;/ 把已经有序的前后两段进行合并 归并排序应用了分治思想,把一个大问题,变成两
6、个小问题;二分是分治的思想;名师归纳总结 - - - - - - -第 3 页,共 22 页精选学习资料 - - - - - - - - - 五、二分查找int findint x,int y,int m /在x,y 区间查找关键字等于m 的元素下标 int head,tail,mid; head=x;tail=y;mid=x+y/2;/ 取中间元素下标 ifamid=m return mid;/ 假如中间元素值为 m 返回中间元素下标 mid ifheadtail return 0;/ 假如 xy ,查找失败,返回 0 ifmamid / 假如 m 比中间元素大,在后半区间查找,返回后半区间
7、查找结果 return findmid+1,tail; else / 假如 m 比中间元素小,在前半区间查找,返回后前区间查找结果 return findhead,mid-1; 六、高精度加法#include #include using namespace std; int main string str1,str2; int a250,b250,len; / 数组的大小打算了运算的高精度最大位数 int i; memseta,0,sizeofa; memsetb,0,sizeofb; cinstr1str2; / 输入两个字符串a 中a0=str1.length; / 取得第一个字符串的长
8、度fori=1;i=a0;i+ / 把第一个字符串转换为整数,存放在数组ai=str1a0-i-0; 名师归纳总结 b0=str2.length; / 取得其次个字符串长度B 中第 4 页,共 22 页fori=1;ib0.a0:b0; / 取两个字符串最大的长度 fori=1;i1 len-; fori=len;i=1;i- coutai; return 0; 留意:两个数相加,结果的位数,应当比两个数中大的那个数多一位;七、高精度减法#include using namespace std; int comparestring s1,string s2; int main string s
9、tr1,str2; int a250,b250,len; int i; memseta,0,sizeofa; memsetb,0,sizeofb; 名师归纳总结 - - - - - - -第 5 页,共 22 页精选学习资料 - - - - - - - - - cinstr1str2; a0=str1.length; fori=1;i=a0;i+ ai=str1a0-i-0; b0=str2.length; fori=1;i=b0;i+ bi=str2b0-i-0; ifcomparestr1,str2=0 fori=1;i=a0;i+ ai-=bi; / 大于等于,做按位减,并处理借位;if
10、 ai1 a0-; fori=a0;i=1;i- coutai; coutendl; else cout-; / 小于就输出负号 fori=1;i=b0;i+ / 做按位减,大的减小的 bi-=ai; if bi1 b0-; 名师归纳总结 - - - - - - -第 6 页,共 22 页精选学习资料 - - - - - - - - - fori=b0;i=1;i- coutbi; couts2.length return 0; ifs1.lengths2.length return 1; forint i=0;is2i return 0; ifs1is2i return 1; / 先比较长度
11、,哪个字符串长,对应的那个数就大/ 长度相同时,就一位一位比较;return 0; / 假如长度相同,每一位也一样,就返回0,说明相等 做减法时,第一要判定两个字符串的大小,打算是否输出负号,然后就是按位减法,留意 处理借位;八、高精度乘法#include #include using namespace std; int main 名师归纳总结 - - - - - - -第 7 页,共 22 页精选学习资料 - - - - - - - - - string str1,str2; int a250,b250,c500,len; /250位以内的两个数相乘int i,j; memseta,0,s
12、izeofa; memsetb,0,sizeofb; cinstr1str2; a0=str1.length; fori=1;i=a0;i+ ai=str1a0-i-0; b0=str2.length; fori=1;i=b0;i+ bi=str2b0-i-0; memsetc,0,sizeofc; fori=1;i=a0;i+ / 做按位乘法同时处理进位,留意循环内语句的写法;forj=1;j1. whileclen=0&len1 len-; / 为什么此处要fori=len;i=1;i- coutci; return 0; 名师归纳总结 - - - - - - -第 8 页,共 22 页精
13、选学习资料 - - - - - - - - - 留意:两个数相乘,结果的位数应当是这两个数的位数和减 1;优化:万进制#include #include using namespace std; void num1int s,string st1; int a2501,b2501,c5002;/此处可以进行2500 位万进制乘法, 即 10000 位十进制乘法;Int main string str1,str2; int len; cinstr1str2; memseta,0,sizeofa; memsetb,0,sizeofb; memsetc,0,sizeofc; num1a,str1;
14、/把 str1 从最低位开头,每4 位存放在数组a 中num1b,str2; /把 str2 从最低位开头,每4 位存放在数组b 中forint i=1;i=a0;i+ /作按位乘法并处理进位,此处是万进制进位forint j=1;j1 len-;/ 去掉高位的 0,并输出最高位 cout=1;i-/把剩下来的每一位仍原成4 位输出第 9 页,共 22 页- - - - - - -精选学习资料 - - - - - - - - - if ci1000 cout0;if ci100 cout0if ci10 cout0;coutci; cout=0;i- / 从最低位开头,处理每一位 if cou
15、nt%4=0 sk+=st1i-0*1000; ifi.=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 maketableint x/建立 X 以内的素数表prim ,primi 为 0,表示 i 为素数,为 1 表示不是质数名师归纳总结 - - - - - - -第 10 页,共 22 页精选学习资料 - - - - - -
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022 完整 word C+ 常用 经典 算法 及其 实现 要点
限制150内