1.冒泡排序:
将无序数组里的每个数字进行大小比较,变为升序数组。
首先将a[1]与a[2]进行比较,若a[1]>a[2],则将两个元素交换位置,然后比较a[2]和a[3],以此类推,直到a[n-1]和a[n]进行比较为止。上述过程为第一趟,其结果使得最大的元素被安置到最后一个位置。然后进行第二趟排序,对前n-1个元素进行同样的操作,其结果使得次大的元素被安置到第n-1的位置上。
#include<stdio.h>
int main()
{
int a[10]={0};
int n,key;
scanf("%d",&n);
int i,j;
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for (i=0;i<n;i++)
{
key=0;
for (j=0; j<n-i-1;j++)
{
if (a[j]>a[j+1])
{
key=1;
int temp;
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
if (key==0)
{
break;
}
}
for(i=0;i<n;i++)
{
printf("%d ",a[i]);
}
return 0;
}
2. 选择查找:
冒泡排序是两两进行交换,则要比较并最多交换n*n次,但是时间复杂度很差,因此可以用选择查找的方法
选择查找是每次在数组中遍历出最小或最大的数,将它与 a [ i ] 进行交换,i 从 0 开始遍历到a [ n - 1 ], 最多交换了n
次,时间复杂度大大降低
将数组中的元素从小到大排列 核心代码:
int i,j,k;
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
{
if(a[k]>a[j])
{
k=j; //找出最小的
}
if(k!=i)
{
int temp;
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
}
3.二分搜索:
又称“折半查找”,即输入一个数x,判断x是否在数组a中存在。
(1)首先必须保证数组a里的元素是升序排列的。
(2)计算出数组的中间值mid,将x与mid进行比较,若相等,则直接输出yes,结束程序,否则判断x与a [ mid ] 的关系。
(3)若x>mid,则证明x是在mid的右边。将left=mid+1,再进行判断。
(4)若x<mid,则证明x是在mid的左边。将right=mid-1,再进行判断。
(5)当 letf > right 证明已经遍历完全,结束程序,输出no
代码如下:
#include<stdio.h>
int f(int x, int left, int right, int a[])
{
if(left>right)
{
return -1;
}
else
{
int mid=(left+right)/2;
if(x==a[mid])
{
return 1;
}
if(x<a[mid])
{
return f(x,left,mid-1,a);
}
else
{
return f(x,mid+1,right,a);
}
}
}
int main()
{
int i,n,x;
int a[10]={0};
scanf("%d%d",&n,&x);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]); //保证输入数据是升序排列
}
int left=0;
int right=n-1;
int m=f(x,left,right,a);
if(m==1)
{
printf("yes\n");
}
else
{
printf("no\n");
}
return 0;
}