折半查找算法

来源:互联网 发布:大数据怎么快速学 编辑:程序博客网 时间:2024/06/06 17:00

       在学习C语言过程中肯定会遇到查找与排序的相关知识,今天又对C语言中的折半查找法又回顾了一遍,其实发现以前的理解还是存在一定的问题的,于是就把今天的所得记录一下。

以下是代码:

//折半查找法#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>//数组作为参数求大小int  Count_array(int arr[]){int *p;int count = 0;p = arr;while ((*p)!=-1){count++;p++;}return count;}int bin_search(int arr[], int num ,int n){int left = 0;int right = n - 1;int mid = 0;while (left <= right){int mid = (right - left) / 2 + left;  //或者写成(right + left )/2if (num > arr[mid]){left = mid +1;}else if (num <arr[mid]){right = mid -1;}else{return mid + 1;}}return -1;}int main(){int array_num[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };int arr_size = sizeof(array_num)/sizeof(array_num[0]);int m = 0;int number = 0;printf("请输入您要查找的数字!\n");scanf("%d", &number);m = bin_search( array_num, number, arr_size);if (m != -1){printf("您要找的数在数组中的下标是:%d\n", m);}else{printf("Sorry!您输入的数字未找到 \n");}return 0;}


       在折半查找中最关键的就是中值得取法,写成Mid = (Left+Right)/2也可以,但是其中会牵扯到一个关于溢出的问题,若Left与Right都比较大,可能会出现关于溢出的问题,那么Mid的表示可能会出现问题。所以最稳妥的方式还是写成Mid = (Right - Left)/2 + Left 的形式。

       还有一点就是while循环中要写成Left<=Right,当然也可以写Left<Right,但是这样的话,下面的代码可能会有小小的变化。若要写成Left<Right

可以参考以下代码:

        int left = 0;int right = n - 1;int mid = 0;while (left < right){int mid = (right - left) / 2 + left;if (num < arr[mid]){right = mid - 1;}else if (num > arr[mid]){left = mid + 1;}else{return mid + 1;}}if (left == right){return left + 1;}else{return -1;}
积少成多,水滴石穿。每天记录学习内容,那么离成功就会越来越近!

1 0
原创粉丝点击