C#查找算法1:二分查找

2023-10-21 17:41:02 浏览数 (1)

二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。

原理:将n个元素分成个数大致相同的两半,取a[n/2]与欲查找的x作比较,

             1. 如果x=a[n/2]则找到x,算法终止;

             2. 如 果x<a[n/2],则我们只要在数组a的左半部继续搜索x

             3. 如果x>a[n/2],则我们只要在数组a的右 半部继续搜索

写法一:采用递归法

代码语言:javascript复制
/// <summary>
        /// 二分法查找,二分查找的条件是原数组有序
        /// 没有找到,返回-1;找到了,则返回索引
        /// </summary>
        /// <param name="arr">数组</param>
        /// <param name="low">开始索引</param>
        /// <param name="height">结束索引</param>
        /// <param name="value">要查找的对象</param>
        static int BinarySearch(int[] arr, int low, int high, int value)
        {
           
            if (arr == null || arr.Length == 0 || low >= high)
            {
                return -1;
            }

            int mid = (low   high) / 2;
            if (value == arr[mid]) //刚好找到对象,返回索引
            {
               
                return mid; 
            }
            else if (value > arr[mid]) // 要查找的对象在右边
            {
                return BinarySearch(arr, mid   1, high,value);
            }
            else //要查找的对象在左边
            {
                return BinarySearch(arr, low, mid - 1, value);
            }
            
        }

写法二:

代码语言:javascript复制
         static int BinarySearch2(int[]arr,int value)
        {
            int low = 0, high = arr.Length - 1,mid=0;
           
            while (low <= high)
            {
                 mid = (low   high) / 2;
                if(value== arr[mid])
                {                  
                    return mid;
                }
                if (value > arr[mid])//在右侧
                {
                     low = mid   1;
                 }
                else//在左侧
                {
                    high = mid - 1;
                }
               
            }
         
            return -1;
        }

运行结果

代码语言:javascript复制
  static void Main(string[] args)
        {
            Console.WriteLine($"数据算法");
            var arr1 = GetArrayData(8, 1, 22);
            Console.WriteLine($"生成未排序数据arr1:{ShowArray(arr1)}");
            //var arr2 = BubbleSort(arr1);
            //Console.WriteLine($"冒泡排序:{ShowArray(arr2)}");
            var arr3 = SelectSort(arr1);
            Console.WriteLine($"选择排序arr3:{ShowArray(arr3)}");
            var val = arr3[3];
           
            var index=  BinarySearch(arr3, 0, arr1.Length - 1,val);
            Console.WriteLine($"{val}在 arr3中出现的索引位置是{index}");
            var val2 = arr3[4];
            var index2 = BinarySearch2(arr3, val2);
            Console.WriteLine($"{val2}在 arr3中出现的索引位置是{index2}");
            Console.ReadLine();
        }

0 人点赞