基于数组的三排序一查找07

上次我们已经认识了一维数组,那今天就学习一下基于一维数组的排序和查找吧!

选择排序:

思想:
         给合适的位置选择合适的数

	int i,j,temp;
	int a[10];
	int len = sizeof(a)/sizeof(a[0]);//求数组元素个数
	printf("请输入十个数:");
	for(i = 0;i < len;++i)
	{
		scanf("%d",&a[i]);
	}

	for(i = 0;i < len - 1;++i)//数组下标最大为元素个数-1,len-1
	{
		for(j = i+1;j < len;++j)
		{
			if(a[j] < a[i])
			{
				temp = a[j];
				a[j] = a[i];
				a[i] = temp;  //交换a[i]a[j]的值
			}
		}
	}

	for(i = 0;i < len;++i)
	{
		printf("a[%d] = %d\n",i,a[i]);
	}

	return 0;

要确定的位置a[i],为这个位置选择合适的数,依次与a[i]之后的数进行比较,如果碰到比a[i]还小的数,则交换他们确保a[i]是它及它之后所有数的最小值。

确定好之后i自增,开始为下一个位置

寻找合适的数,重复上述操作确定好之后i自增,开始为下一个位置

寻找合适的数,重复上述操作

 冒泡排序:  

思想:
       一次冒出一个数 
       相邻两个元素,两两比较,小的放前,大的放后

代码:

	int i,j,temp;

	int a[8];
	int len = sizeof(a)/sizeof(a[0]);
	for(i = 0;i < 8;++i)
	{
		scanf("%d",&a[i]);
	}
	

	for(i = 1;i < len;++i)
	{
		for(j = 0;j < len-i;++j)
		{
			if(a[j] >a[j+1])
			{
				temp = a[j+1];
				a[j+1] = a[j];
				a[j] = temp;
			}
		}
	}

	for(i = 0;i < len;++i)
	{
		printf("%d\n",a[i]);
	}

控制好趟数后,从第一位开始往后比较,使a[j+1]始终为最大值,最后使a[j+1]冒泡到最后一位然后进行下一趟冒泡,下一趟冒泡的比较次数比前一趟减少一次

每一趟选出剩余所有数的最大值,冒泡到最后一位

插入排序

        思想:
        在有序序列中,找到合适的位置插入 

代码(其中注释掉的部分借助了b数组进行插入,目的是便于理解,后面的为原地插入称为插入排序)

int a[]={8,7,9,6,3,1,88};
	int len = sizeof(a)/sizeof(a[0]);
	int b[len];
	int i,j,t;

#if 0
	for(i = 0;i < len;++i)
	{
		t = a[i];
		j = i;
		while(j > 0 && t < b[j-1])
		{
			b[j] = b[j-1];
			--j;
		}
		b[j] = t;
	}


	for(i = 0;i < len;++i)
	{
		printf("%d\n",b[i]);
	}
#endif
	for(i = 1;i < len;++i)
	{
		t = a[i];
		j = i;
		while(j > 0 && t < a[j-1])
		{
			a[j] = a[j-1];
			--j;
		}
		a[j] = t;
	}

	for(i = 0;i < len;++i)
		printf("%d\n",a[i]);

在有序序列中找到合适的位置插入

从第二位开始与第一位进行比较,先将这个数固定如果比第一位小则将第一位的值赋给第二位,固定的值赋给第一位,这个第二位数就找到了自己合适的位置插了进去

然后第三位数开始插入,固定过后开始与第二位进行比较如果比第二位小,则将第二位的值赋给第三位,然后与第一位进行比较如果比第一位小则将第一位的值赋给第二位,固定的值赋给第一位,(如果比第一位大则将则将第三位固定的值赋给第二位)这个第三位数就找到了自己合适的位置插了进去

查找算法

二分查找(折半查找) 
     大前提:
        数据得是有序的
        
    思想:
        1. 找到中间位置的数, //下标 
        2. 拿这个数 和 要找的数比较 

代码

int m;
	scanf("%d",&m);
	i = 0;
	j = len - 1;
	int mid;
	while(i <= j)
	{
		mid = (i + j)/2;
		if(b[mid] > m)
		{
			j = mid - 1;
		}else if(b[mid] < m)
		{
			i = mid + 1;
		}else
		{
			break;
		}
	}

	if(i <= j)
	{
		printf("找到了");
	}else
	{
		printf("没找到");
	}

首先找到begin=0和end=len-1的值,循环始终满足begin<end,

找到中间位置的数的下标mid=(begin+end)/2;将a[mid]与要查找的数m,进行比较,

如果a[mid]>m,则end=mid-1,如果a[mid]<m,则begin=mid+1(假定数组升序),

都不满足则跳出循环。不断循环直到找到跳出循环,或未查找到不在满足循环条件结束

推导

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值