• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 183,  comments - 10,  trackbacks - 0

            二分查找的變形

            傳統(tǒng)的二分查找
            數(shù)組時(shí)有序的,要么升序要么降序,這里不考慮重復(fù)元素出現(xiàn)的情況。

            int foo(int a[], int n, int item)
            {
                
            int left = 0, right = n - 1;
                
            int middle = 0;
                
            while (left <= right)
                {
                    middle 
            = (left + right) / 2;
                    
            if (item > a[middle])
                    {
                        left 
            = middle + 1;
                    }
                    
            else if (item < a[middle])
                    {
                        right 
            = middle - 1;
                    }
                    
            else
                    {
                        
            return middle;
                    
                    }
                }
                
            return -1;
            }

             


            二分查找的變形
            給定一個(gè)數(shù)組 int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
            如果對該數(shù)組調(diào)整為
            {6, 7, 8, 9, 10, 1, 2, 3, 4, 5}
            調(diào)整后即是兩個(gè)連續(xù)有序序列,只不過整體不有序
            還是用二分策略,但是具體細(xì)節(jié)需要改進(jìn)
            整體結(jié)構(gòu)還是一樣的
            具體補(bǔ)充的是當(dāng)待查找元素與中間元素不相等時(shí),
            如果小于,還要檢測 item 與 a[left] 的大小關(guān)系
            如果大于,還要檢測 item 與 a[right] 的大小關(guān)系

            int bar(int a[], int n, int item)
            {
                
            int left = 0, right = n - 1;
                
            int middle = 0;
                
            while (left <= right)
                {
                    middle 
            = (left + right) / 2;
                    
            if (item < a[middle])
                    {
                        
            if (a[left] < item)
                        {
                            right 
            = middle - 1;
                        }
                        
            else if (a[left] > item)
                        {
                            left 
            = middle + 1;
                        }
                        
            else
                        {
                            
            return left;
                        }
                        
            // right = middle - 1;
                    }
                    
            else if (item > a[middle])
                    {
                        
            if (a[right] > item)
                        {
                            left 
            = middle + 1;
                        }
                        
            else if (a[right] < item)
                        {
                            right 
            = middle - 1;
                        }
                        
            else
                        {
                            
            return right;
                        }
                    }
                    
            else
                    {
                        
            return middle;
                    }
                }
                
            return -1;
            }

             1 #include <iostream>
             2 using namespace std;
             3 
             4 int foo(int a[], int n, int item)
             5 {
             6     int left = 0, right = n - 1;
             7     int middle = 0;
             8     while (left <= right)
             9     {
            10         middle = (left + right) / 2;
            11         if (item > a[middle])
            12         {
            13             left = middle + 1;
            14         }
            15         else if (item < a[middle])
            16         {
            17             right = middle - 1;
            18         }
            19         else
            20         {
            21             return middle;
            22         
            23         }
            24     }
            25     return -1;
            26 }
            27 
            28 int bar(int a[], int n, int item)
            29 {
            30     int left = 0, right = n - 1;
            31     int middle = 0;
            32     while (left <= right)
            33     {
            34         middle = (left + right) / 2;
            35         if (item < a[middle])
            36         {
            37             if (a[left] < item)
            38             {
            39                 right = middle - 1;
            40             }
            41             else if (a[left] > item)
            42             {
            43                 left = middle + 1;
            44             }
            45             else
            46             {
            47                 return left;
            48             }
            49             // right = middle - 1;
            50         }
            51         else if (item > a[middle])
            52         {
            53             if (a[right] > item)
            54             {
            55                 left = middle + 1;
            56             }
            57             else if (a[right] < item)
            58             {
            59                 right = middle - 1;
            60             }
            61             else
            62             {
            63                 return right;
            64             }
            65         }
            66         else
            67         {
            68             return middle;
            69         }
            70     }
            71     return -1;
            72 }
            73 
            74 int main()
            75 {
            76     int a[] = {12345678910};
            77     cout << foo(a, sizeof (a) / sizeof (*a), 3<< endl;
            78     int b[] = {67891012345};
            79     cout << bar(b, sizeof (b) / sizeof (*b), 5<< endl;
            80     return 0;
            81 }

            實(shí)現(xiàn):



            posted on 2011-10-29 00:04 unixfy 閱讀(177) 評論(0)  編輯 收藏 引用
            91精品国产综合久久四虎久久无码一级 | 久久大香萑太香蕉av| 亚洲国产精品久久久久婷婷软件| 国产成人精品综合久久久久| 亚洲&#228;v永久无码精品天堂久久| 精品久久久久久亚洲| 久久国产精品99精品国产| 久久久久亚洲精品无码蜜桃| 囯产精品久久久久久久久蜜桃 | 久久精品综合网| 午夜精品久久久久久| 亚洲精品无码久久毛片| 少妇久久久久久被弄到高潮| 久久久久99精品成人片三人毛片 | 亚洲第一永久AV网站久久精品男人的天堂AV | 亚洲精品成人网久久久久久| 久久久久国产一区二区三区| 97超级碰碰碰碰久久久久| 精品久久久久久无码中文字幕| 国产一级做a爰片久久毛片| 一本色道久久88加勒比—综合| 国产精品成人99久久久久 | 久久婷婷五月综合成人D啪| 精品国产99久久久久久麻豆| 久久亚洲精品中文字幕| 久久国产免费观看精品3| 四虎国产精品免费久久5151 | 久久久久久久综合综合狠狠| 国产精品久久久久一区二区三区| 久久国产精品偷99| 久久99久久99精品免视看动漫| 久久水蜜桃亚洲av无码精品麻豆| 狠狠色婷婷综合天天久久丁香| 久久99精品久久久久久水蜜桃 | 欧洲精品久久久av无码电影| 97精品久久天干天天天按摩| 国产伊人久久| 亚洲愉拍99热成人精品热久久| 国产欧美一区二区久久| 一级女性全黄久久生活片免费| 亚洲AV无码久久精品狠狠爱浪潮|