• <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

            二分查找的變形

            傳統的二分查找
            數組時有序的,要么升序要么降序,這里不考慮重復元素出現的情況。

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

             


            二分查找的變形
            給定一個數組 int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
            如果對該數組調整為
            {6, 7, 8, 9, 10, 1, 2, 3, 4, 5}
            調整后即是兩個連續有序序列,只不過整體不有序
            還是用二分策略,但是具體細節需要改進
            整體結構還是一樣的
            具體補充的是當待查找元素與中間元素不相等時,
            如果小于,還要檢測 item 與 a[left] 的大小關系
            如果大于,還要檢測 item 與 a[right] 的大小關系

            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 }

            實現:



            posted on 2011-10-29 00:04 unixfy 閱讀(179) 評論(0)  編輯 收藏 引用
            观看 国产综合久久久久鬼色 欧美 亚洲 一区二区 | 亚洲欧洲久久久精品| 一97日本道伊人久久综合影院| 亚洲国产天堂久久久久久| 久久久久亚洲av成人网人人软件| 中文字幕日本人妻久久久免费| 99久久精品费精品国产一区二区| 精品久久久久久久久久久久久久久| 久久人做人爽一区二区三区| 九九精品99久久久香蕉| 无码任你躁久久久久久久| 青草国产精品久久久久久| 久久久久无码专区亚洲av| 久久99精品久久久久久动态图 | 免费精品久久久久久中文字幕| 精品伊人久久大线蕉色首页| 国产精品VIDEOSSEX久久发布| 久久婷婷五月综合97色直播| 99久久精品免费看国产一区二区三区| 国产精品一区二区久久精品涩爱 | 欧美成a人片免费看久久| 久久精品国产亚洲av高清漫画| 久久综合狠狠综合久久97色| 久久国产乱子精品免费女| 日韩精品久久无码中文字幕| 国产69精品久久久久APP下载| 国产福利电影一区二区三区久久老子无码午夜伦不 | 久久99精品国产99久久6男男| 中文国产成人精品久久亚洲精品AⅤ无码精品 | 亚洲AV无码久久| 国色天香久久久久久久小说| 久久中文字幕精品| 亚洲欧美国产精品专区久久| 一本久久综合亚洲鲁鲁五月天| 国产巨作麻豆欧美亚洲综合久久| 一级做a爰片久久毛片16| 国产精品一区二区久久| 久久99热国产这有精品| 久久福利青草精品资源站免费| 97久久精品午夜一区二区| 久久99精品国产一区二区三区|