第一:二分法
将一个排好序列的数组,不断分成两半,然后再可能包含我们所要查找的值的那一部分中搜索。
缺点:
1.如果数据里面有两个或两个以上的相同元素,那么二分法就会不确定返回数组的那个值
(下标)。
2.要求数组必须是有序的,要么从小到大,要么从大到小。
检测数组是否按照顺序排列:
#include<iostream>
using namespace std;
bool add(int a[], int m);
int main()
{
int a[]={12,23,34,51,3,4,5};
cout<<"数组前4个元素按照顺序排列,为1则是,为0则否。····"<<add(a,4)<<endl;
cout<<"数组前7个元素按照顺序排列,为1则是,为0则否。·······"<<add(a,7)<<endl;
return 0;
}
bool add(int a[], int m)
{
for(int i=1;i<m;i++)
if (a[i]<a[i-1]) //如果改成if (a[i]>a[i+1]) ,会出错, 因为最后一个i=m-1. m=i+1,a[i+1]==a[m];造成数组越界...
return false;
return true;
}
比如1:
#include<iostream>
using namespace std;
int find(int m, int[], int n);
void main()
{
int a[]={1,2,3,5,6,7,8,9,10,11};
cout<<"1在数组a中的位置是:"<<find(1,a,11)<<endl;
cout<<"3在数组a中的位置是:"<<find(3,a,11)<<endl;
}
int find(int m, int a[], int n )
{
int o=0,h=n-1,i;
while(o<=h)
{
i=(o+h)/2;
if (a[i]==m)
{
return i;
}
if (a[i]<m)
{
o=i+1;
}
else
h=i-1;
}
return n;
}
比如2:
#include<iostream>
using namespace std;
int find(int m, int[], int n);
void main()
{
int a[]={1,2,3,5,6,7,8,9,10,11};
int check=find(5,a,10);
cout<<check<<endl;
if (check==2)
{
cout<<"find zhe number !!"<<endl;
}
else
cout<<"2在数组a中的位置是:"<<check<<endl;
}
int find(int m, int a[], int n )
{
int o=0,h=n-1,i;
while(o<=h)
{
i=(o+h)/2;
if (a[i]==m)
{
return i;
}
if (a[i]<m)
{
o=i+1;
}
else
h=i-1;
}
return n;
}
二:冒泡法:
把特定输入的数按照从大到校的顺序排列:
分析:
4 3 2 1
第一回(j=1):3 4 2 1 3 2 4 1 3 2 1 4 排列3次(i=4-j=3)
第二回(j=2):2 3 1 4 2 1 3 4 排列2次 (i=4-j=2)
第三回(j=3):1 2 3 4 排列1次 (i=4-j=1)
for(j=0;j<3;j++)
for(i=0;i<4-j;i++)
{
}
#include<iostream>
using namespace std;
int main()
{
int a[10];
int i,j,t;
cout<<"请输入10个数字:"<<endl;
for (i=0;i<10;i++)
cin>>a[i];
for(j=0;j<9;j++)
for (i=0;i<10-j-1;i++)
if (a[i]>a[i+1])
{
t=a[i];
a[i]=a[i+1];
a[i+1]=t;
}
cout<<"输出这十个数:"<<endl;
for (i=0;i<10;i++)
{
cout<<a[i];
}
return 0;
}