c++常考算法知识点汇总

前言:写这篇博客完全是给自己当做笔记用的,考虑到自己的c++基础不是很踏实,只在大一学了一学期,c++的面向对象等更深的知识也一直没去学。就是想当遇到一些比较小的知识,切不值得用一整篇

博客去记述的时候,可以考虑到都汇总在这,时不时回来复习一下也挺好。总之,这篇博客可能会不断更新,emmm,内容上也完全是准对我啦(可能更多都是算法上的知识点),大家如果看到了也别吐槽内容太乱太杂或太基础,哈哈。

1三角函数,反三角函数,求夹角

C++中cos,sin,asin,acos这些三角函数操作的是弧度(实数,非复数),而非角度,你需要把角度转化为弧度.

 弧度=角度*Pi/180;

对于两条边的夹角θ=acos(v1v2/||v1||||v2||),注意θ是弧度值。

demo如下

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 struct Point{
 4  double x;
 5  double y;
 6 };
 7 double PI=3.1415926;
 8 double Long=0;
 9 double computeLength(Point p1,Point p2)
10 {
11     double l=sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
12     return l;
13 }
14 //求两条边的夹角大小
15 double jiaoDu(Point A,Point B,Point C)
16 {
17     double BA=computeLength(A,B);
18     double BC=computeLength(B,C);
19     double X=(A.x-B.x)*(C.x-B.x)+(A.y-B.y)*(C.y-B.y);
20     double X1=X/BA*BC;//角度变弧度
21     return acos(X1)*180/PI;
22 }
23 //求弧长
24 double huChang(double r,double jiaodu){
25     double huDu=jiaodu*3.1415926/180;
26     return huDu*r;
27 }
28 int main()
29 {
30     int n=3;
31     cout << "请输入三个点的坐标" << endl;
32     Point point[101];
33     for(int i=1;i<=n;i++){
34         cin >> point[i].x;
35         cin >> point[i].y;
36     }
37 
38     cout << "向量BA的长度为" <<  setiosflags(ios::fixed) << setprecision(2)<<computeLength(point[1],point[2]) << endl;
39     cout << "向量BC的长度为" <<  setiosflags(ios::fixed) << setprecision(2)<<computeLength(point[2],point[3]) << endl;
40     double a=jiaoDu(point[1],point[2],point[3]);
41     cout << "角ABC的大小为为" << setiosflags(ios::fixed) << setprecision(2)<<jiaoDu(point[1],point[2],point[3]) << endl;
42     return 0;
43 }
View Code

2malloc和new的区别

1,malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。
2,对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。
3,因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。
4,C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。
5、new可以认为是malloc加构造函数的执行。new出来的指针是直接带类型信息的。而malloc返回的都是void指针。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 int main()
 5 {
 6     int *p=new int[10];
 7     p[0]=1;
 8     delete p;
 9     p=NULL;
10     
11     int *p1=(int *)malloc(sizeof(int)*10);
12     p1[0]=2;
13     cout << p1[0] << endl;
14     free(p1);
15     
16     return 0;
17 }
View Code

3字符串和数组的几个小知识

 1  string str="hello";
 2     char arr[30];
 3     strcpy(arr,str.c_str());//字符串变字符数组 
 4     
 5     strlen(arr1)//求字符数组的长度
 6     str.length();//求字符串的长度
 7     sizeof(arr2)/sizeof(int);//求整数数组的长度 
 8     
 9     *max_element(array,array+n)//求数组里面的最大值是谁,不改变数组 
10     *min_element(array,array+n)//求数组里面的最小值是谁,不改变数组 
11     
12     reverse(str.begin(),str.end());//反转字符串 
13     
14     reverse(arr,arr+n);
15     puts(arr);//反转数组
16     
17     srand((unsigned)time(NULL));
18     rand()%10;//产生随机数、
19     
20     bool cmp(int a,int b){
21         return a>b;
22     } 
23     sort(a,a+n,cmp)//从大到大小排序
24     
25     void func(int **array,int m,int n){} <==> void func(int array[][],int m,int n){}
View Code

4两种全排列算法(排列的结果的顺序不同)

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int num1=0;
 4 int num2=0; 
 5 void Swap(int &a,int &b){
 6     int temp;
 7     temp=b;
 8     b=a;
 9     a=temp;
10 }
11 
12 void  perm(int array[],int k,int m){
13     if(k==m){
14         for(int i=0;i<=m;i++){
15             cout << array[i] << " ";
16         }
17         cout << endl;
18         num1++;
19     }
20     else{
21         for(int i=k;i<=m;i++){
22             Swap(array[k],array[i]);
23             perm(array,k+1,m);
24             Swap(array[k],array[i]);
25         }
26     }
27 }
28 
29 int main()
30 {
31     int array[10]={3,2,1,5,6,7,8,9,4,0};
32     sort(array,array+sizeof(array)/sizeof(int));
33     perm(array,0,4);//方法一:自定义排序函数 
34     cout << "0~4的全排列总有" << num1 << ""  << endl;
35    cout << "----------------------------------------------------------------" << endl;
36    do{
37        for(int i=0;i<5;i++){
38            cout << array[i] << " ";
39        }
40        num2++;
41        cout << endl;
42    }while(next_permutation(array,array+5));//方法二:使用next_permutation(array,array+n);实现排序 
43      cout << "0~4的全排列总有" << num2 << ""  << endl;
44     return 0;
45 }
View Code

5二分查找

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int binarysearch(int array[],int x,int n){
 4     int left=0;
 5     int right=n-1;
 6     while(left<right){
 7         int middle=(left+right)/2;
 8         if(array[middle]==x) return middle;
 9         if(array[middle]<x) left=middle+1;
10         if(array[middle]>x) right=middle-1;
11     }
12    return -1;
13 } 
14 int main()
15 {
16     int array[10]={3,2,1,5,6,7,8,9,4,0};
17     sort(array,array+10);
18     int a=binarysearch(array,10,sizeof(array)/sizeof(int));
19     if(a==-1) cout << "没找到" << endl;
20     else   cout << "找到该数字,在顺序排列后的数组的下标为" <<  a<<  endl;
21     return 0;
22 }
View Code

 6合并排序

 1 template<class Type>
 2 void MergeSort(Type a[],int left,int right)
 3 {
 4     if(left<right){//至少有两个元素 
 5         int i=(left+right)/2;//取中点 
 6         MergeSort(a,left,i);
 7         MergeSort(a,i+1,right);
 8         Merge(a,b,left,i,right);//合并到数组b 
 9         Copy(a,b,left,right);//复制回数组a 
10     } 
11 }
View Code
 1 #include <bits/stdc++.h>
 2 
 3 using namespace std;
 4 template<class Type>
 5 int Merge(Type a[],Type c[],int l,int m,int r){
 6         int i=l;
 7         int j=m+1;
 8         int k=0;
 9         while((i<=m) && (j<=r)){
10             if(a[i]<=a[j]) c[k++]=a[i++];
11             if(a[i]>a[j]) c[k++]=a[j++];
12 
13         }
14         if(i<=m)
15         {
16             for(int q=i;q<=m;q++){
17                 c[k++]=a[q];
18             }
19         }
20         if(j<=r){
21            for(int q=j;q<=r;q++){
22                 c[k++]=a[q];
23             }
24         }
25         return 1;
26 }
27 template<class Type>
28 int MergeSort(Type a[],Type b[],int left,int right){
29     if(left<right){
30         int i=(left+right)/2;
31         MergeSort(a,b,left,i);
32         MergeSort(a,b,i+1,right);
33         Merge(a,b,left,i,right);
34     }
35 }
36 int main()
37 {
38     int a[12]={1,3,5,7,9,2,4,6,8,10,12,14};
39     int b[12];
40     MergeSort(a,b,0,11);
41     for(int i=0;i<=11;i++){
42         cout << b[i] << " ";
43     }
44     return 0;
45 }
View Code

7快排

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 void Swap(int &a,int &b)
 4 {
 5     int temp;
 6     temp=a;
 7     a=b;
 8     b=temp;
 9 }
10 
11 int Partition(int a[],int p,int r)
12 {
13     int i=p;
14     int j=r+1;
15     int x=a[p];
16     while(true){
17         while(a[++i] < x && i<r);
18         while(a[--j] > x);
19         if(i>=j) break;
20         Swap(a[i],a[j]);
21     }
22     a[p]=a[j];
23     a[j]=x;
24     return j;
25 }
26 void QuickSort(int a[],int p,int r)
27 {
28     if(p<r){
29         int q=Partition(a,p,r);
30         QuickSort(a,p,q-1);
31         QuickSort(a,q+1,r);
32     }
33  } 
34 int main()
35 {
36     int array[10]={0,5,2,7,9,1,3,4,6,8};
37     QuickSort(array,0,9);
38     for(int i=0;i<10;i++){
39         cout << array[i]  << " ";
40     }
41     return 0;
42 }
View Code

 8半数集

 1 long f(int n){
 2     long sum=1;
 3     if(a[n]>0) return a[n];
 4 
 5         for(int i=1;i<=n/2;i++){
 6             sum += f(i);
 7         }
 8         a[n]=sum;
 9         return sum;
10 }
View Code

9集合划分

1 int f(int n,int m)
2 {
3     if(n==1) return 1;//只有一个集合
4     if(m==m) return 1;//每个元素一个集合
5     else{
6         return m*f(n-1,m)+f(n-1,m+1);//向n-1个元素划分的m个集合里添加一个新元素,有m*f(n-1,m)种,
7     }                                    //向n-1个元素划分的m个集合里添加一个独立元素,有f(n-1,m+1)种,
8         
9 }
View Code

10整数因子分解问题

1 void f(n)
2 {
3     if(n==1) num+=1;
4     for(int i=2;i<=n;i++){
5         if(n%2==0) f(n%i);
6     }
7 }
View Code

 11利用二分法求最大值

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int getMax(int array[],int begin,int end)
 4 {
 5     if(begin==end) return array[end];
 6     int mid=(begin+end)/2;
 7     int max1=getMax(array,begin,mid);
 8     int max2=getMax(array,mid+1,end);
 9     return max1>max2?max1:max2;
10 }
11 int main()
12 {
13     int array[15]={18,1,3,5,7,9,7,5,3,4,11,44,5,3};
14     cout << getMax(array,0,13);
15     return 0;
16 }
View Code

12二叉树遍历(递归)

 1 typedef struct node                           //定义二叉树的结点
 2 {    int data;          //结点的数据
 3     struct node*lChild,*rChild;    //结点左右孩子
 4 }Node;
 5 void inOrder(Node *root)    //中序遍历
 6 {
 7     if(root!=0)              //如果根节点不为0
 8     {
 9           inOrder(root->lChild);       //指向左孩子
10           printf("%d ",root->data);   //打印当前结点
11           inOrder(root->rChild);      //指向右孩子
12     }
13 }
View Code

 13最大字段和

 1  int MaxSum(int n,int a[])
 2       {
 3           int sum = 0;
 4           int b = 0;
 5           for(int i = 1; i <= n; i++)
 6           {
 7               if(b > 0)
 8                   b += a[i];
 9               else
10                   b = a[i];
11               if(b > sum)
12                   sum = b;
13           }
14           return sum;
15       }
View Code

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~不断更新中。

原文地址:https://www.cnblogs.com/henuliulei/p/10544213.html