各种算法五

各种算法五

 我们来看看基本的超找滴呀;

 在我们的算法中,有一种叫做线性查找。

 分为:顺序查找。

         折半查找。

顺序查找:

    这种非常简单,就是过一下数组,一个一个的比,找到为止。

 ps 顺便看到一个go相关的博客,我记录一下:http://blog.csdn.net/tybaoerge/article/details/50392386  

   //基本的顺序查找太简单,其实就是找到你想要的额匹配项了滴呀;
        public static void LookUp()
        {
            List<int> list = new List<int>() { 2, 3, 5, 8, 7 };
            var result = GetIndex(list, 3);
            if (result != -1)
                Console.WriteLine("索引位置为:" + result);
            else
                Console.WriteLine("没有找到!");
            Console.Read();


        }

        static int GetIndex(List<int> list, int key)
        {
            for (int i = 0; i < list.Count; i++)
            {
                if (key == list[i])
                    return i; //返回制定的索引滴呀;
            }
            return -1;
        }

分半查找方式滴呀;这种方式,仅仅限于我们的奇数个值滴呀;可惜了~~~

      static int GetIndex01(List<int> list, int key)
        {
            //这种方式就要分我们的奇数个还是我们的偶数个了滴呀;
            //这个折半,也是那么简单的折半滴呀;
            var len = list.Count;
            var half = list.Count / 2;
            for (int i = 0; i < half; i++)
            {
                //其实这种比较的没有太大的比较,但依然可以看成是一种简单额优化吧;
                if (list[i] == key)
                {
                    return i;
                }
                if (list[len - 1-i] == key)
                {
                    return len - 1 - i;
                }
            }
            return -1;
        }

当然,我们可以进一步的各种优化滴呀;效果还是不错滴呀;

这样就算找到了我们比较通用的方法了;效果还是不错滴呀;恩恩,样滴呀;

       static int GetIndex02(List<int> list, int key)
        {
            //这种方式就要分我们的奇数个还是我们的偶数个了滴呀;
            //这个折半,也是那么简单的折半滴呀;
            var len = list.Count;
            var low = 0;
            var high = (len - 1);
            for (int i = 0; i < len; i++)
            {
                if (low <= high)  //这样我们的查找就可以继续滴呀;
                {
                    if (list[low] == key)
                    {
                        return low;
                    }
                    else
                    {
                        low++;
                    }
                    if (list[high] == key)
                    {
                        return high;
                    }
                    else
                    {
                        high--;
                    }
                }
              
            }
            return -1;
        }

总结:

如果使用平法的话;就会出现下面额情况滴呀;
如果是偶数的话,那么就敲好评分了;
如果是奇数的话,那么就会出现左右相差一的情况;

如果是low 和 high 两个指针的话,应该就是
左右两边刚好相等;
如果是奇数的话,low 和high 会指到统一index,然后再比较;
效果非常好的呀; 

折半查找

          使用折半查找是必须有前提滴呀;

  第一: 数组必须有序,不是有序就必须让其有序,大家也知道最快的排序也是NLogN的,所以.....呜呜。

  第二: 这种查找只限于线性的顺序存储结构。

好了,继续敲代码,ps,今天是星期五,好吧~

//上面的查找,技术含量太低了一点底呀;
        //是灰常滴呀;

        public static int ContinuteLookUpInformation()
        {
            //这个典型的缺点就是我们的表,必须是有序的表滴哎呀;
            //并且插入和删除是由困难的,因为你要维持他的“顺序”滴呀;
            //这里的折半,如果是奇数和偶数的数组呢?
            //这些都是很有趣的各种算法滴呀;
            List<int> list = new List<int>() { 3, 7, 9, 10, 11, 24, 45, 66, 77 };
            int key = 10;
            int low = 0;
            int high = list.Count - 1;
            while (low <= high)
            {
                //取出中间的额值;
                int middle= (low + high) / 2;
                if (list[middle] == key)
                {
                    return middle; //返回数组下标
                }else
                {
                    if (list[middle] > key)  //确定指针钱移 还是 后移的关键滴呀;
                    {
                        //到前面去找
                        high = middle - 1;
                    }else
                    {
                        low = middle + 1;
                        //到后去找滴哎呀;
                    }
                }

            }
            return -1;//没有找到我们想要的值滴呀;

        }

这里补充一个,关于数组,奇数后偶的折半问题;

x奇数: 1 2 3 4 5 

y偶数:1 2 3 4

x/2=2;

y/2=2;

因为都是int 类型的;

x,第一次比较的正好是3

第二次, low=0 high=1; (low+hig)/2=0  如果还没找到到  (low+high)=1

这样左右两个数都比较了;

实现的方式也是多种多样滴呀;

原文地址:https://www.cnblogs.com/mc67/p/6212253.html