各种算法五

各种算法五

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

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

分为:顺序查找。

折半查找。

顺序查找:

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

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的,所以.....呜呜。

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

时间: 2024-08-24 11:04:36

各种算法五的相关文章

C语言经典算法五个人问岁数!——————【Badboy】

有5 个人坐在一起,问第五个人多少岁?他说比第4 个人大2 岁.问第4 个人岁数,他说比第3 个人大2 岁.问第三个人,又说比第2 人大两岁.问第2 个人,说比第一个人大两岁.最后问第一个人,他说是10 岁.请问第五个人多大? 1.程序分析:利用递归的方法,递归分为回推和递推两个阶段.要想知道第五个人岁数,需知道第四人的岁数,依次类推,推到第一人(10 岁),再往回推. 2.程序源代码: #include #include int main() { int i=5; int age(int);

java算法---五家共井

古代数学巨著<九章算数>中有这么一道题叫“五家共井,甲二绠(汲水用的井绳)不足,如(接上)乙一绠:乙三绠不足,如丙一绠: 丙四绠不足,如丁一绠:丁五绠不足,如戊一绠:戊六绠不足,如甲一绠,皆及. 意思就是说五家人共用一口井,甲家的绳子用两条不够,还要再用乙家的绳子一条才能打到井水:乙家的绳子用三条不够,还要再用丙家的绳子 一条才能打到井水:丙家的绳子用四条不够,还要再用丁家的绳子一条才能打到井水:丁家的绳子用五条不够,还要再用戊家的绳子一条才能打 到井水:戊家的绳子用六条不够,还要再用甲家的绳

排序算法五:随机化快速排序(Randomized quicksort)

上一篇提到,快速排序的平均时间复杂度是O(nlgn),比其他相同时间复杂度的堆排序.归并排序都要快,但这是有前提的,就是假定要排序的序列是随机分布的,而不是有序的.实际上,对于已经排好的序列,如果用快速排序时间复杂度是O(n2).为应对这样的有序序列,于是出现了本篇要讲的随机化快速排序(Randomized quicksort). 快速排序在选主元(pivot)时,总是选择第一个:随机化快速排序的思想是,随机从序列中选择一个作为主元. (一)算法实现 1 protected void quick

Java排序算法(五):堆排序

[算法说明] 堆排序是对简单选择排序的改进 简单选择排序是从n个记录中找出一个最小的记录,需要比较n-1次.但是这样的操作并没有把每一趟的比较结果保存下来,在后一趟的比较中,有许多比较在前一趟已经做过了,但由于前一趟排序时未保存这些比较结果,所以后一趟排序时又重复执行了这些比较操作,因而记录的比较次数较多. 堆是具有下列性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆:或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆. [算法思想] 将待排序的序列构造成一个大顶

算法五:希尔排序

希尔排序(Shell Sort)是插入排序的一种.也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法.该方法因DL.Shell于1959年提出而得名.先取一个小于n的整数d1作为第一个增量,把文件的全部记录分组.所有距离为d1的倍数的记录放在同一个组中.先在各组内进行直接插入排序:然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量=1(<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止. 1.就是先确定步长,按照步长(le

iOS算法(五)之折半查找

二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好:其缺点是要求待查表为有序表,且插入删除困难.因此,折半查找方法适用于不经常变动而查找频繁的有序列表. 折半查找法的两种实现 折半查找法思想: 在有序表中,把待查找数据值与查找范围的中间元素值进行比较,会有三种情况出现: 1)     待查找数据值与中间元素值正好相等,则放回中间元素值的索引. 2)     待查找数据值比中间元素值小,则以整个查找范围的前半部分作为新的查找范围,执行1),直到找到相等的值. 3)     待查找数据值

如何在Cocos2D游戏中实现A*寻路算法(五)

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流之用,请勿进行商业用途.同时,转载时不要移除本申明.如产生任何纠纷,均与本博客所有人.发表该翻译稿之人无任何关系.谢谢合作! 跟随着黄色砖块前进 现在我们已经找到了我们的路径,我们只需要让猫咪跟随它. 我们接下来要做的是记住整个路径,并且使得猫咪根据路径一步一步的移动. 在CatSprite.h中建

Java数据结构和算法(五)——队列

队列,queqe,就是现实生活中的排队. 1.简单队列: public class Queqe { private int array[]; private int front; private int end; private int number; private int max; private Queqe(int maxsize){ array = new int[maxsize]; max = maxsize; front = 0; end = 0; number = 0; } pri

五种常用的算法设计技巧之二:分治算法

一,介绍 分治算法主要包含两个步骤:分.治.分,就是递归地将原问题分解成小问题:治则是:在解决了各个小问题之后(各个击破之后)合并小问题的解,从而得到整个问题的解 二,分治递归表达式 分治算法一般都可以写出一个递归表达式:比如经典的归并排序的递归表达式:T(N)=2T(N/2)+O(N) T(N)代表整个原问题,采用了分治解决方案后,它可以表示成: ①分解成了两个规模只有原来一半(N/2)的子问题:T(N/2) ②当解决完这两个子问题T(N/2)之后,再合并这两个子问题需要的代价是 O(N) 递