1、5种方式实现二分查找,案例结构:
halfFind.h
#ifndef _HALFFIND_
#define _HALFFIND_
/************************************************************************/
/* 初始化长度为L的数组 */
/************************************************************************/
extern void initArray(int *arr, int n);
/************************************************************************/
/* 打印数组 */
/************************************************************************/
extern void printArr(int *arr, int n);
/************************************************************************/
/* 打印次数 */
/************************************************************************/
extern void printTimes(int pos);
/************************************************************************/
/* 通过While循环的方式实现二分查找 */
/************************************************************************/
extern int halfFindByWhile(int *arr, int n, int num);
/************************************************************************/
/* 二分查找查询某个数值,通过do-while */
/************************************************************************/
extern int halfFindByDoWhile(int *arr, int n, int num);
/************************************************************************/
/* 二分查找,通过goto语句实现 */
/************************************************************************/
extern int halfFindByGoto(int *arr, int n, int num);
/************************************************************************/
/* 通过For循环的方式实现二分查找 */
/************************************************************************/
extern int halfFindByFor(int *arr, int n, int num);
/************************************************************************/
/* 通过递归的方式进行查找 */
/************************************************************************/
extern int halfFindByRecursion(int *arr,int n,int num);
#endif
halfFuncs.c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "halfFind.h"
/************************************************************************/
/* 初始化数组的值 */
/************************************************************************/
//voidinitArray(int *arr,int n)
//{
// //时间数据类型
// time_t ts;
// unsigned int num = time(&ts);
// //初始化随机数种子
// srand(num);
// for (int i = 0; i < n; i++) {
// arr[i] = rand() % n;
// }
//}
/************************************************************************/
/* 初始化数组的值 */
/************************************************************************/
void initArray(int *arr, int n)
{
for (int i = 0; i < n; i++) {
arr[i] = i;
}
}
/************************************************************************/
/* 打印数组 */
/************************************************************************/
void printArr(int *arr, int n)
{
for (int i = 0; i < n; i++)
{
printf("%d ",arr[i]);
}
}
/************************************************************************/
/* 打印搜索次数 */
/************************************************************************/
void printTimes(int pos) {
printf("\nposition = %d\n",pos);
}
/************************************************************************/
/* 二分查找查询某个数值,通过While表达式 */
/************************************************************************/
int halfFindByWhile(int *arr, int n, int num)
{
//参数分别表示开始查询位置,结束查询位置,中间位置
int start_pos = 0, end_pos = n - 1, middle_pos = 0;
while (start_pos <= end_pos)
{
middle_pos = (start_pos + end_pos) / 2;
//如果中间值恰好是要找的值
if (num == arr[middle_pos])
{
return middle_pos;
}
else if (num > arr[middle_pos])
{
start_pos = middle_pos + 1;
}
else
{
end_pos = middle_pos - 1;
}
}
if (start_pos > end_pos)
{
printf("\n没有找到\n");
return -1;
}
}
/************************************************************************/
/* 二分查找查询某个数值,通过do-while */
/************************************************************************/
int halfFindByDoWhile(int *arr, int n, int num)
{
//参数分别表示开始查询位置,结束查询位置,中间位置
int start_pos = 0, end_pos = n - 1, middle_pos = 0;
do
{
middle_pos = (start_pos + end_pos) / 2;
//如果中间值恰好是要找的值
if (num == arr[middle_pos])
{
return middle_pos;
}
else if (num > arr[middle_pos])
{
start_pos = middle_pos + 1;
}
else
{
end_pos = middle_pos - 1;
}
} while (start_pos <= end_pos);
if (start_pos > end_pos)
{
printf("\n没有找到\n");
return -1;
}
}
/************************************************************************/
/* 通过goto语句查找 */
/************************************************************************/
int halfFindByGoto(int *arr, int n, int num)
{
//参数分别表示开始查询位置,结束查询位置,中间位置
int start_pos = 0, end_pos = n - 1, middle_pos = 0;
flag:middle_pos = (start_pos + end_pos) / 2;
//如果中间值恰好是要找的值
if (num == arr[middle_pos])
{
return middle_pos;
}
else if (num > arr[middle_pos])
{
start_pos = middle_pos + 1;
}
else
{
end_pos = middle_pos - 1;
}
if (start_pos <= end_pos)
{
goto flag;
}
else
{
printf("\n对不起,没有找到!\n");
return -1;
}
}
/************************************************************************/
/* 通过for循环的方式进行查找 */
/************************************************************************/
int halfFindByFor(int *arr, int n, int num)
{
//参数分别表示开始查询位置,结束查询位置,中间位置
int start_pos = 0, end_pos = n - 1, middle_pos = 0;
for (; start_pos <= end_pos;)
{
middle_pos = (start_pos + end_pos) / 2;
//如果中间值恰好是要找的值
if (num == arr[middle_pos])
{
return middle_pos;
}
else if (num > arr[middle_pos])
{
start_pos = middle_pos + 1;
}
else
{
end_pos = middle_pos - 1;
}
}
if (start_pos > end_pos)
{
printf("\n对不起,没有找到!\n");
return -1;
}
}
/************************************************************************/
/* 通过递归的方式二分查找 */
/************************************************************************/
int recursion(int *arr, int n, int num, int start_pos,int end_pos,int middle_pos)
{
if(start_pos <= end_pos)
{
middle_pos = (start_pos + end_pos) / 2;
//如果中间值恰好是要找的值
if (num == arr[middle_pos])
{
return middle_pos;
}
else if (num > arr[middle_pos])
{
start_pos = middle_pos + 1;
}
else
{
end_pos = middle_pos - 1;
}
}
else
{
printf("\n对不起,没有找到!\n");
return -1;
}
recursion(arr, n, num, start_pos, end_pos, middle_pos);
}
/************************************************************************/
/* 通过递归的方式进行二分查找 */
/************************************************************************/
int halfFindByRecursion(int *arr, int n, int num)
{
//参数分别表示开始查询位置,结束查询位置,中间位置
int start_pos = 0, end_pos = n - 1, middle_pos = 0;
//接收递归返回来的值
return recursion(arr, n, num, start_pos, end_pos, middle_pos);
}
halfFind.c
#include <stdio.h>
#include <stdlib.h>
#include "halfFind.h"
#define N 45
int main(int argc,char *argv[]){
int arr[N];
//times表示查找了多少次
//start_pos表示开始查找位置
//end_pos最后位置
//num标识要查找的值
int pos;
initArray(arr,N);
//打印数组
printArr(arr, N);
//查找
//1、通过while的方式进行查找
//pos = halfFindByWhile(arr, N, 60);
//2、通过do-while的方式进行查找
//pos = halfFindByDoWhile(arr, N, 60);
//3、通过for循环的方式进行二分查找
//pos = halfFindByGoto(arr,N,30);
//4、通过for循环的方式进行二分查找
//pos = halfFindByFor(arr,N,30);
//5、通过递归的方式实现二分查找
pos = halfFindByRecursion(arr,N,60);
printTimes(pos);
system("pause");
return 0;
}
2、结合结构体实现栈存储结构,代码如下:
#include <stdio.h>
#include <stdlib.h>
#define N 50
struct mystack
{
int top;//栈顶
int data[N];//存放数据
};
struct mystack selfstack = { -1, { 0 } };//栈的初始化
//函数声明
int isempty(); //1为空 0非空
void setempty(); //栈设置为空
int push(int num); //压入数据,成功1,失败返回0
int pop(); //弹出数据
/************************************************************************/
/* 判断栈是否为空 */
/************************************************************************/
int isempty()
{
if (selfstack.top == -1)
{
//表示是空的
return 1;
}
else
{
//表示不是空的
return 0;
}
}
/************************************************************************/
/* 将栈设置成为空 */
/************************************************************************/
void setempty()
{
selfstack.top = -1;
}
/************************************************************************/
/* 压入数据,成功返回1,失败返回0 */
/************************************************************************/
int push(int num)
{
//一定要记住:要判断栈是否溢出
if (selfstack.top == N - 1)
{
//压栈失败
return 0;
}
else
{
selfstack.top += 1; //小标移动一下
selfstack.data[selfstack.top] = num;//压入数据
return 1;
}
}
/************************************************************************/
/* 弹出数据 */
/************************************************************************/
int pop()
{
//判断栈是否为空
if (selfstack.top == -1)
{
return -1;//栈为空
}
else
{
selfstack.top -= 1;
return selfstack.data[selfstack.top + 1];//弹出的数据
}
}
int main(int argc, char *argv[])
{
int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int i = 0;
for (i = 0; i < 10; i++)
{
//填充数据
push(a[i]);
}
while (!isempty())
{
printf("%d\n", pop());//输出数据
}
system("pause");
return 0;
}