赞
踩
int main() {
int a=1,b=10,temp;
temp=a;
a=b;
b=temp;
cout<<"a="<<a<<" b="<<b<<endl;
system("pause");
return 0;
}
void swap1(int x,int y); int main() { int a,b; a=1; b=10; cout<<"一个不成功的swap方法"<<endl; cout<<"a="<<a<<" b="<<b<<endl; swap1(a,b);//此处参数是按值传递的方式,将a和b各拷贝一个传递进去并进行交换 //所以发生变化的是拷贝的a和b,输出的a和b未发生改变 cout<<"a="<<a<<" b="<<b<<endl; system("pause"); return 0; } void swap1(int x,int y) { int temp; temp=x; x=y; y=temp; }
输出:
一个不成功的swap方法
a=1 b=10
a=1 b=10
void swap1(int *x,int *y); int main() { int a,b; a=1; b=10; cout<<"a="<<a<<" b="<<b<<endl; swap1(&a,&b);//因为swap1函数的参数是指针,因此这里需要是地址传递 cout<<"a="<<a<<" b="<<b<<endl; system("pause"); return 0; } void swap1(int *x,int *y) { int temp; temp=*x; *x=*y; *y=temp; }
输出:
a=1 b=10
a=10 b=1
void swap1(int &x,int &y); int main() { int a,b; a=1; b=10; cout<<"a="<<a<<" b="<<b<<endl; swap1(a,b);//因为引用就是别名,因此可以直接传递 cout<<"a="<<a<<" b="<<b<<endl; system("pause"); return 0; } void swap1(int &x,int &y) { int temp; temp=x; x=y; y=temp; }
输出:
a=1 b=10
a=10 b=1
各种类型都可以用,无论 int 或 double 等。
#define SWAP(x,y,t)((t)=(x),(x)=(y),(y)=(t))
int main() {
int a,b,temp;
a=1;
b=10;
cout<<"a="<<a<<" b="<<b<<endl;
SWAP(a,b,temp);
cout<<"a="<<a<<" b="<<b<<endl;
system("pause");
return 0;
}
输出:
a=1 b=10
a=10 b=1
各种类型都可以用,无论 int 或 double 等。
int main() {
int a,b;
a=1;
b=10;
cout<<"a="<<a<<" b="<<b<<endl;
std::swap(a,b);//C++内已经有这个函数,不用我们再自己写。直接调用即可
cout<<"a="<<a<<" b="<<b<<endl;
system("pause");
return 0;
}
输出:
a=1 b=10
a=10 b=1
思想:从左向右扫描数据,选择最大的数据,放在右边;
要点:比较相邻的两个数,如果左边的数大于右边的数,就进行交换。
法1:
//函数声明 void bubblesort(int list[],int n); //list是一个数组,n代表数组元素的个数 int main() { int a[]={2,4,6,8,0,1,3,5,7,9}; bubblesort(a,10); for(int k=0;k<10;k++) { cout<<a[k]<<" "; } system("pause"); return 0; } void bubblesort(int list[],int n) //函数定义 { for(int i=0;i<n-1;i++) { //如果有10个数据,则一共需要扫描9遍 //每一遍扫描都是从list[0]开始, //第一遍扫描:从list[0]扫到list[9] //第二遍扫描:从list[0]到list[8];以此类推 for(int j=0;j<n-i-1;j++) { if(list[j]>list[j+1]) { std::swap(list[j],list[j+1]); }; } } }
输出:
0 1 2 3 4 5 6 7 8 9
法2:
int main() { int arr[9]={4,2,8,0,5,7,1,3,9}; //1.创建数组 cout<<"排序前:"; for(int i=0;i<9;i++) { cout<<arr[i]<<" "; } cout<<endl; //2.开始排序 //总共排序轮数=元素个数-1 for(int i=0;i<9-1;i++) { //内层循环对比次数=元素个数-当前轮数-1 for(int j=0;j<9-i-1;j++) { if(arr[j]>arr[j+1]) //如果第一个数字比第二个数字大,则交换两个数字 { int temp=arr[j]; arr[j]=arr[j+1]; arr[j+1]=temp; } } } cout<<"排序后:"; for(int i=0;i<9;i++) { cout<<arr[i]<<" "; } system("pause"); return 0; }
从当前未排序的整数中找一个最小的整数,将它放在已排序的整数列表的后面。
要点:每次扫描只进行一次交换;选则一个最小的,放在左边。
void selectsort(int *a,const int n); //函数声明 int main() { int a[]={1,3,5,7,9,0,2,4,6,8}; selectsort(a,10); for(int k=0;k<10;k++) { cout<<a[k]<<" "; } system("pause"); return 0; } void selectsort(int *list,const int n) //函数定义 { for(int i=0;i<n;i++) { int min=i;//把min看做一条毛巾,对数据做记号,暂定认为list[min]最小 for(int j=i+1;j<n;j++)//第二遍扫描时,从第二个元素即list[1]开始 { if(list[j]<list[min]) { min=j;//扫描中发现list[j]比之前暂定的最小值还要小,就把最小值替换为list[j] } } swap(list[i],list[min]); } }
//设房间里有n个人,是无序状态,他们要依次到房间外进行有序排队 void insert( int *a,int n); int main() { int x[]={2,4,6,8,0,1,3,5,7,9}; insert(x,10); for(int i=0;i<10;++i) { cout<<x[i]<<" "; } system("pause"); return 0; } void insert( int *a,int n) { int in,out;//out代表房间内未排队的人,in代表房间外已经排好队的人 //开始时,out=0这个人已经出去了 for(out=1;out<n;++out) { int temp=a[out]; in=out; while(in>0 && a[in-1]>=temp) { a[in]=a[in-1]; --in; } a[in]=temp; } }
输出:
0 1 2 3 4 5 6 7 8 9
最流行的排序算法、速度最快的排序算法;
运用递归思路。
没有排序的数据,只能进行顺序查找;
顺序查找速度较慢,二分查找速度比较快;
有排序的数据,可以进行顺序查找和二分查找。
//顺序查找 int sequent(int *a,const int n,const int x); //所要查找的数值是x int main() { int m[]={1,3,5,7,9,0,2,4,6,8}; int result; result=sequent(m,10,3); if(result==-1) { cout<<"没找到该数值"<<endl; } else { cout<<"所找数值在m["<<result<<"]里"<<endl; } system("pause"); return 0; } int sequent(int *a,const int n,const int x) { int i; for( i=0;i<n;i++) { if(a[i]==x) { return i;//如果找到x,则返回下标i } } if(i==n) //如果没找到x,则返回-1 { return -1; } }
二分查找,速度比较快。
int binary(int *a,const int n,const int x); //用指针*a表示数组;n是数组元素个数;x是要查找的数据 int main() { int m[]={1,3,5,7,9,0,2,4,6,8}; int result; result=binary(m,10,7); if(result==-1) { cout<<"没找到该数值"<<endl; } else { cout<<"所找数值在m["<<result<<"]里"<<endl; } system("pause"); return 0; } int binary(int *a,const int n,const int x) { int low,high,mid;//分别表示最小的下标、最大的下标、下标中间值 low=0; high=n-1; while(low<=high) { mid=(low+high)/2; if(a[mid]==x) { return mid; } else if(a[mid]<x) { low=mid+1; } else { high=mid-1; } } return -1; }
输出:
所找数值在m[3]里
递归,就是在运行的过程中调用自己。
一个简单例子:
void a()
{
cout<<"hello"<<endl;
a();//自己又调用了自己
}
int main() {
a();
system("pause");
return 0;
}
输出:无限循环hello,陷入死循环
//5!= 5*4*3*2*1 //5! = 5*4! 4!=4*3! 3!=3*2! 2!=2*1! 1!=1*0! 0!=1 //n! = n*(n-1)! long int JC(int n) { if(n==0) { return 1; } else { return n*JC(n-1); } } int main() { cout<<JC(5)<<endl; //5的阶乘 for(int num=0;num<10;num++) //0-9的阶乘 { cout<<num<<"!="<<JC(num)<<endl; } system("pause"); return 0; }
输出:
120
0!=1
1!=1
2!=2
3!=6
4!=24
5!=120
6!=720
7!=5040
8!=40320
9!=362880
long int JC(int n) { long r=1; for(int i=n;i>0;i--) { r=r*i; } return r; } int main() { cout<<JC(5)<<endl; //5的阶乘 for(int num=0;num<10;num++) //0-9的阶乘 { cout<<num<<"!="<<JC(num)<<endl; } system("pause"); return 0; }
输出:同上
int binary(int *a,const int n,const int x); //迭代(循环)方式 int binary1(int *a,const int x,const int low,const int high);//递归方式 int main() { int m[]={1,3,5,7,9}; int result; result=binary1(m,7,0,4);//递归方式 if(result==-1) { cout<<"没找到该数值"<<endl; } else { cout<<"所找数值在m["<<result<<"]里"<<endl; } system("pause"); return 0; } int binary(int *a,const int n,const int x) //迭代(循环)的方式 { int low,high,mid;//分别表示最小的下标、最大的下标、下标中间值 low=0; high=n-1; while(low<=high) { mid=(low+high)/2; if(a[mid]==x) { return mid; } else if(a[mid]<x) { low=mid+1; } else { high=mid-1; } } return -1; } int binary1(int *a,const int x,const int low,const int high)//递归方式 { if(low<=high) { int mid=(low+high)/2; if(x<a[mid]) { return binary1(a,x,low,mid-1); } else if(x>a[mid]) { return binary1(a,x,mid+1,high); } else { return mid; } } return -1; }
输出:
所找数值在m[3]里
//对abc进行排列组合 void permutation( char *p,const int m,const int n)//m和n代表数组元素下标 { if(m==n) { for(int i=0;i<=n;i++) { cout<<p[i]; } cout<<endl; } else { for(int i=m;i<=n;i++) { swap(p[m],p[i]); permutation(p,m+1,n); swap(p[m],p[i]); } } //swap(p[0],p[0]); //permutation(p,1,2); //swap(p[0],p[0]);//以a开头,后面跟着bc的所有排列 //swap(p[0],p[1]); //permutation(p,1,2); //swap(p[0],p[1]);//以b开头,后面跟着ac的所有排列 //swap(p[0],p[2]); //permutation(p,1,2); //swap(p[0],p[2]);//以c开头,后面跟着ab的所有排列 } int main() { char s[]="abc"; permutation(s,0,2); system("pause"); return 0; }
输出:
abc
acb
bac
bca
cba
cab
插在表头:如图,把陈插到表头
p->next=head; //先把陈与张连接,使结点张作为结点陈的后继节点
head=p; //修改表头指针head,使其指向新的头结点陈
插在表中:如图,把陈插到王和李之间
p->next=q->next; //先把陈与李连接
q->next=p; //再把王与陈连接
删除表头结点:
q=head; //为了回收空间,先用q指针记住表头张
head=head->next; //修改head,使其指向新的表头结点
free(q); //将空间回归
删除表中结点:删除结点王
p=q->next; //先用p指针记住结点李
//此时结点赵的地址是p->next,也是q->next->next
q->next=p->next; //将结点王的后继结点修改为结点赵,即删除了结点李
free(p); //将空间回收
链表的特点:
构造链表的通用算法
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。