• <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};
            如果對(duì)該數(shù)組調(diào)整為
            {6, 7, 8, 9, 10, 1, 2, 3, 4, 5}
            調(diào)整后即是兩個(gè)連續(xù)有序序列,只不過(guò)整體不有序
            還是用二分策略,但是具體細(xì)節(jié)需要改進(jìn)
            整體結(jié)構(gòu)還是一樣的
            具體補(bǔ)充的是當(dāng)待查找元素與中間元素不相等時(shí),
            如果小于,還要檢測(cè) item 與 a[left] 的大小關(guān)系
            如果大于,還要檢測(cè) 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 閱讀(189) 評(píng)論(0)  編輯 收藏 引用

            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            亚洲色大成网站WWW久久九九| 久久久久国产精品嫩草影院| 麻豆精品久久精品色综合| 久久九九免费高清视频| 中文字幕无码久久人妻| 久久九九有精品国产23百花影院| 久久久综合香蕉尹人综合网| 无码人妻久久一区二区三区| 国产激情久久久久影院老熟女免费| 久久国产影院| 久久精品国产免费一区| 久久综合五月丁香久久激情| 久久超碰97人人做人人爱| 亚洲精品99久久久久中文字幕| 久久超碰97人人做人人爱| 亚洲精品成人网久久久久久| 一本伊大人香蕉久久网手机| 久久精品人成免费| 国内精品九九久久精品| 久久久99精品成人片中文字幕| 国内精品久久久久久野外| 97久久国产露脸精品国产| 亚洲一级Av无码毛片久久精品| 国内精品久久久久久中文字幕 | 久久99国产精品久久久 | 国产精品免费福利久久| 久久亚洲精品无码aⅴ大香| 久久亚洲av无码精品浪潮| 91精品日韩人妻无码久久不卡| 精品人妻久久久久久888| 77777亚洲午夜久久多人| 久久精品国产免费观看| 免费精品久久天干天干| 久久久久久精品成人免费图片| 2019久久久高清456| 狠狠综合久久AV一区二区三区| 久久91精品国产91久| 精品国产乱码久久久久久呢| 无码专区久久综合久中文字幕 | 久久综合狠狠综合久久激情 | 亚洲乱码日产精品a级毛片久久|