首页 > 编程语言 > 详细

C#查找算法之二分查找

时间:2020-11-25 09:41:31      阅读:47      评论:0      收藏:0      [点我收藏+]

二分查找也称折半查找(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的右 半部继续搜索

 

写法一:采用递归法

        /// <summary>
        /// 选择排序
        /// </summary>
        /// <param name="arr"></param>
        /// <returns></returns>
        static int[] SelectSort(int[] arr)
        {
            for (int i = 0; i < arr.Length; i++)// 4.继续遍历,将最小数,放入第二个,第三个...第n个位置
            {
                int minValueIndex = i; //最小值的下标位置,初始设为第一个位置
                for (int j = i + 1; j < arr.Length; j++)// 2. 比较遍历后,找出这些待排序数据中最小值的下标位置
                {
                    if (arr[j] < arr[minValueIndex])//1. 比较两元素,将较小值的下标位置赋值给 minValueIndex
                    {
                        minValueIndex = j;
                    }
                }
                //3. 将选出的最小元素,与第一个位置的元素,进行交换(即选出了最小的一个数,放入了第一个位置)
                var temp = arr[i];
                arr[i] = arr[minValueIndex];
                arr[minValueIndex] = temp;
            }

            return arr;
        }

        /// <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);
            }
            
        }

写法二:

         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;
        }

 

运行结果

  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();
        }

 

技术分享图片

 

C#查找算法之二分查找

原文:https://www.cnblogs.com/for-easy-fast/p/14033577.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!