二分查找
给定一个有序数列,查找指定的数值在第几位
- 注意整个循环体的条件是用low<=high来判断的,以及low=mid+1,若最后low>high 都没查到 跳不出循环 就说明不存在
- 注意n==a[mid] n等于的是在mid位置的存的值 不是mid哦
- 最后算多少位的时候mid要+1 因为mid是与a[N]一样是从0开始算的
#include<stdio.h>
#define N 10
int main()
{
int a[N]={11,12,13,14,15,16,17,18,19,20};
int high,mid,low,n;
high=N-1;
low=0;
scanf("%d",&n);
while(low<=high)
{
mid=(low+high)/2;
if(n==a[mid]) break;
else if(n<a[mid]) high=mid-1;
else low=mid+1;
}
if(low<=high) printf(" 第几位=%d",mid+1);
else {printf("no found");}
return 0;
}
冒泡排序
- 两个for叠加循环那里是精髓 相邻两个数比较 排序 最后那个数就用j<N-1放着不用管了
#include <stdio.h>
#define N 10
int main()
{
int i,j,a[N],turn;
for(i=0;i<N;i++)
{
scanf("%d",&a[i]);
}
for(i=1;i<N;i++)
{
for(j=0;j<N-i;j++)
{
if(a[j]<a[j+1])
{
turn=a[j];
a[j]=a[j+1];
a[j+1]=turn;
}
}
}
for(i=0;i<N;i++)
printf("%3d",a[i]);
return 0;
}
插入排序算法
- 算法的精髓在于while部分,while部分的j-- 就是依次降级 后面自减后的j+1就相当于j(大概意思是这样的)
- 重点就是从第二项开始,依次取一项向前比较大小 比完就放好 循环
#include <stdio.h>
#define N 6
int main()
{
int i,j,a[N],turn;
for(i=0;i<N;i++)
{
scanf("%d",&a[i]);
}
for(i=1;i<N;i++)
{
turn=a[i];
j=i-1;
while(j>=0&&turn<a[j])
{
a[j+1]=a[j];
j--;
}
a[j+1]=turn;
}
for(i=0;i<N;i++)
printf("%3d",a[i]);
return 0;
}
牛顿迭代法
- 记住公式
- fabs()是求小数的绝对值 abs()是求整数的绝对值
- 记住大致流程吧
#include<stdio.h>
int main()
{
double x1,x,f,f1;
scanf("%lf",&x1);
do{
x=x1;
f=x*(2*x*x-x*4+3)-6;
f1=6*x*x-8*x+3;
x1=x-f/f1;
}while(fabs(x1-x)<=1e-5);
printf("%lf",x1);
return 0;
}