冒泡排序,选择查找,二分搜索

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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值