C语言第15题:二分查找+二分递归查找 终于知道函数封装的好处了

今天又回来学习啦,预计今天完成C的学习,晚上开始学习C++
和大家简单唠唠嗑,因为现在在秋招,我一开始在做图像处理相关的,当初为了偷懒,不想学习C\C++,选择了python学习,学习过python的小伙伴,一定知道,这个是比较简单的,很多已经被做成了函数和库,可是去找图像相关的工作,对学历、算法要求还有不少,于是找工作很不顺利(当然也是自己学的不精),于是准备转找嵌入式相关的,因为我也有1-2年的嵌入式软件相关的编程,但是忘得差不多了,于是从C开始捡。
正在学习的小伙伴也要好好的准备吧,不然以后找工作就很麻烦了,好了,看看今天的。

对了哦,这里还要再说一个,函数封装以后真是太香了,拷贝过来直接使用。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#pragma warning(disable:4996) //注意这一句的使用,可以解决C语言中出现的一些兼容性问题


// 顺序查找(效率低 )查找不稳定
// 在指定范围内寻找和相同的值,找到了返回下标,找不到返回-1
int seq(int *array, int low, int high,int key)
{
	int i;
	for (i = low; i < high; i++)
	{
		if (array[i] == key)
			return i;
	}
	return -1;
}

//定义一个打印函数,进行数组打印
void printf_array(int *p, int n)
{
	int i = 0;
	for (i = 0; i < n; i++)
	{
		printf("%d ", p[i]);
	}
	printf("\n");
}

//定义一个地址传递函数,进行大小比较(地址传递)
void swap_array(int *a, int *b)
{
	int temp;
	temp = *a;
	*a = *b;
	*b = temp;
}

//冒泡核心算法,注意!这里是通过地址进行传递的
void bubble_sort(int *p, int n)
{
	int i, j;
	for (i = 0; i < n - 1; i++)
	{
		for (j = 0; j < n - i - 1; j++)
		{
			if (p[j] > p[j + 1])
			{
				swap_array(&p[j], &p[j + 1]);
			}
		}
	}
}



// 二分查找,在已经排序的数中查找
int bin(int *array, int low, int high, int key)
{
	while (low <= high)//这个和二分法递归是有本质区别的,这个是不停地循环,而递归的终止条件是判断
	{
		int mid = (low + high) / 2;
		if (key == array[mid])//中间切一刀,正好和要查找的数相等
			return mid;
		else if (key > array[mid])//如果要找的数大于array[mid],那么就在下半部分继续切刀
		{
				low = mid+1;//注意:为什么这里是加1? 因为:这里写的是向右取值,中间的已经跳过了,所以需要+1
		}
		else //如果要找的数小于array[mid],那么就在下半部分继续切分
		{
			high = mid - 1; //注意:为什么这里是减1? 因为:这里写的是向左取值,中间的已经跳过了,所以需要 -1
		}
	}
	return -1;
}

// 二分法查找递归
int bin_rec(int *array, int low, int high, int key)
{
	if (low <= high)//递归终止条件
	{
		int mid = (low + high) / 2;
		if (key == array[mid])
			return mid;
		else if (key > array[mid])
			return bin_rec(array, mid + 1, high, key); //在下半部分查找
		else
			return bin_rec(array, low, mid - 1, key);
	}
	return -1;
}


void main()
{

	int array[10] = { 23,34,45,43,32,21,27,87,65,60 };

	bubble_sort(array,10);
	printf_array(array,10);
	int a = bin_rec(array, 0, 10, 87);
	printf("%d\n",a);
	system("pause");
}

这个是写的比较多的一个,也有一些注释,大家可以看看!
(完!)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值