二分查找(5种方式实现二分查找),栈

简介:  1、5种方式实现二分查找,案例结构: halfFind.h #ifndef _HALFFIND_ #define _HALFFIND_   /************************************************************************/ /* 初始化长度为L的数组       


15种方式实现二分查找,案例结构:

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;

}

 

 

 

目录
相关文章
|
2月前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
292 9
|
2月前
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
45 1
|
16天前
|
存储 C语言 C++
【C++数据结构——栈与队列】顺序栈的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现顺序栈的基本运算。开始你的任务吧,祝你成功!​ 相关知识 初始化栈 销毁栈 判断栈是否为空 进栈 出栈 取栈顶元素 1.初始化栈 概念:初始化栈是为栈的使用做准备,包括分配内存空间(如果是动态分配)和设置栈的初始状态。栈有顺序栈和链式栈两种常见形式。对于顺序栈,通常需要定义一个数组来存储栈元素,并设置一个变量来记录栈顶位置;对于链式栈,需要定义节点结构,包含数据域和指针域,同时初始化栈顶指针。 示例(顺序栈): 以下是一个简单的顺序栈初始化示例,假设用C语言实现,栈中存储
132 77
|
16天前
|
存储 C++ 索引
【C++数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】
【数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】初始化队列、销毁队列、判断队列是否为空、进队列、出队列等。本关任务:编写一个程序实现环形队列的基本运算。(6)出队列序列:yzopq2*(5)依次进队列元素:opq2*(6)出队列序列:bcdef。(2)依次进队列元素:abc。(5)依次进队列元素:def。(2)依次进队列元素:xyz。开始你的任务吧,祝你成功!(4)出队一个元素a。(4)出队一个元素x。
37 13
【C++数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】
|
16天前
|
存储 C语言 C++
【C++数据结构——栈与队列】链栈的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现链栈的基本运算。开始你的任务吧,祝你成功!​ 相关知识 初始化栈 销毁栈 判断栈是否为空 进栈 出栈 取栈顶元素 初始化栈 概念:初始化栈是为栈的使用做准备,包括分配内存空间(如果是动态分配)和设置栈的初始状态。栈有顺序栈和链式栈两种常见形式。对于顺序栈,通常需要定义一个数组来存储栈元素,并设置一个变量来记录栈顶位置;对于链式栈,需要定义节点结构,包含数据域和指针域,同时初始化栈顶指针。 示例(顺序栈): 以下是一个简单的顺序栈初始化示例,假设用C语言实现,栈中存储整数,最大
40 9
|
16天前
|
C++
【C++数据结构——栈和队列】括号配对(头歌实践教学平台习题)【合集】
【数据结构——栈和队列】括号配对(头歌实践教学平台习题)【合集】(1)遇到左括号:进栈Push()(2)遇到右括号:若栈顶元素为左括号,则出栈Pop();否则返回false。(3)当遍历表达式结束,且栈为空时,则返回true,否则返回false。本关任务:编写一个程序利用栈判断左、右圆括号是否配对。为了完成本关任务,你需要掌握:栈对括号的处理。(1)遇到左括号:进栈Push()开始你的任务吧,祝你成功!测试输入:(()))
31 7
|
2月前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
91 5
|
2月前
|
存储 算法 Java
数据结构的栈
栈作为一种简单而高效的数据结构,在计算机科学和软件开发中有着广泛的应用。通过合理地使用栈,可以有效地解决许多与数据存储和操作相关的问题。
104 21
|
2月前
|
存储 JavaScript 前端开发
执行上下文和执行栈
执行上下文是JavaScript运行代码时的环境,每个执行上下文都有自己的变量对象、作用域链和this值。执行栈用于管理函数调用,每当调用一个函数,就会在栈中添加一个新的执行上下文。
|
2月前
|
存储
系统调用处理程序在内核栈中保存了哪些上下文信息?
【10月更文挑战第29天】系统调用处理程序在内核栈中保存的这些上下文信息对于保证系统调用的正确执行和用户程序的正常恢复至关重要。通过准确地保存和恢复这些信息,操作系统能够实现用户模式和内核模式之间的无缝切换,为用户程序提供稳定、可靠的系统服务。
63 4

热门文章

最新文章