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

            逆序數(shù)的計(jì)算

            常規(guī)的做法
            時(shí)間:O(N^2)

             1 #include <iostream>
             2 #include <vector>
             3 using namespace std;
             4 
             5 int foo(const vector<int>& array)
             6 {
             7     int ret = 0;
             8     for (vector<int>::size_type i = 0; i != array.size() - 1++i)
             9     {
            10         for (vector<int>::size_type j = i + 1; j != array.size(); ++j)
            11         {
            12             if (array[i] > array[j])
            13             {
            14                 ++ret;
            15             }
            16         }
            17     }
            18     return ret;
            19 }
            20 
            21 int main()
            22 {
            23     vector<int> array;
            24     
            25     for (int i = 10; i > 0--i)
            26     {
            27         array.push_back(i);
            28     }
            29     cout << foo(array) << endl;
            30     return 0;
            31 }

             


            改進(jìn)的做法
            利用分治法,借助歸并排序求解逆序數(shù)。
            時(shí)間復(fù)雜度:O(NlogN)
            在歸并排序的基礎(chǔ)做一個(gè)修改即可:
            不是算右邊的相對(duì)左邊的逆序數(shù),這樣太過(guò)于繁雜
            而是算左邊相當(dāng)于右邊的逆序數(shù),這樣可以就在這一個(gè)地方做統(tǒng)一處理
            即當(dāng)檢測(cè)到左邊大于右邊的時(shí)候,則所有剩下的左邊的數(shù)都相對(duì)于當(dāng)前右邊的數(shù)大,所以逆序數(shù)都要加 1 。
            count += (end1 - begin1 + 1);
             1 #include <iostream>
             2 #include <cstdlib>
             3 #include <cstring>
             4 using namespace std;
             5 
             6 int count = 0;
             7 
             8 void merge(int array[], int low, int mid, int high)
             9 {
            10         int i, k;
            11         int *temp = (int *) malloc((high-low+1* sizeof(int)); //申請(qǐng)空間,使其大小為兩個(gè)已經(jīng)排序序列之和,該空間用來(lái)存放合并后的序列
            12         int begin1 = low;
            13         int end1 = mid;
            14         int begin2 = mid + 1;
            15         int end2 = high;
            16  
            17         for (k = 0; begin1 <= end1 && begin2 <= end2; ++k)  //比較兩個(gè)指針?biāo)赶虻脑兀x擇相對(duì)小的元素放入到合并空間,并移動(dòng)指針到下一位置
            18                 if(array[begin1]<=array[begin2])
            19                 {
            20                         temp[k] = array[begin1++];
            21                         
            22                 }
            23                 else
            24                 {   
            25                         //++count;
            26                         
            27                         // 不是算右邊的相對(duì)左邊的逆序數(shù),這樣太過(guò)于繁雜
            28                         // 而是算左邊相當(dāng)于右邊的逆序數(shù),這樣可以就在這一個(gè)地方做統(tǒng)一處理
            29                         count += (end1 - begin1 + 1);
            30                         temp[k] = array[begin2++];    
            31                 }
            32         if(begin1 <= end1) //若第一個(gè)序列有剩余,直接拷貝出來(lái)粘到合并序列尾
            33         {
            34                 memcpy(temp+k, array+begin1, (end1-begin1+1)*sizeof(int));
            35                 //count += (end1 - begin1 + 1) * (high - mid);
            36         }
            37         if(begin2 <= end2) //若第二個(gè)序列有剩余,直接拷貝出來(lái)粘到合并序列尾
            38                 memcpy(temp+k, array+begin2, (end2-begin2+1)*sizeof(int));
            39         memcpy(array+low, temp, (high-low+1)*sizeof(int));//將排序好的序列拷貝回?cái)?shù)組中
            40         free(temp);
            41 }
            42 
            43 int merge_sort(int array[], unsigned int first, unsigned int last)
            44 {
            45         int mid = 0;
            46         if(first<last)
            47         {
            48                 mid = (first+last)/2;
            49                 merge_sort(array, first, mid);
            50                 merge_sort(array, mid+1,last);
            51                 merge(array,first,mid,last);
            52         }
            53         return count;
            54 }
            55 
            56 
            57 int foo(int array[], int n)
            58 {
            59     return merge_sort(array, 0, n - 1);
            60 }
            61 
            62 int main()
            63 {
            64     int array[] = {910876543210};
            65     // int array[] = {1, 3, 2, 4, 3};
            66     // int array[] = {1, 3, 2};
            67     cout << foo(array, sizeof (array) / sizeof (*array)) << endl;
            68     return 0;
            69 }

            http://www.cnblogs.com/dskit/archive/2009/12/16/1625942.html

            http://hi.baidu.com/xiaohanhoho/blog/item/277a09392a0e4722b8998fdc.html

            http://www.shnenglu.com/asp/articles/14261.html

            http://www.cublog.cn/u2/62093/showart_484338.html

            http://blog.csdn.net/guzhilei1986/archive/2008/04/10/2276782.aspx

             


            posted on 2011-06-22 01:11 unixfy 閱讀(553) 評(píng)論(0)  編輯 收藏 引用

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


            久久综合色区| 激情综合色综合久久综合| 久久精品免费一区二区| 国内高清久久久久久| 国产精品久久影院| 日产久久强奸免费的看| 久久精品国产久精国产思思| 亚洲精品高清久久| 麻豆精品久久久久久久99蜜桃 | 四虎影视久久久免费观看| 精品国产乱码久久久久软件| 麻豆精品久久精品色综合| 亚洲国产小视频精品久久久三级| 亚洲国产精品无码成人片久久| 国产精品99久久久久久猫咪| 久久99这里只有精品国产| 99久久精品久久久久久清纯| 国产成人精品久久| 久久久久人妻精品一区三寸蜜桃| 人妻无码αv中文字幕久久| 久久综合视频网站| 久久av高潮av无码av喷吹| 精品国产VA久久久久久久冰| 色狠狠久久综合网| 久久综合视频网站| 亚洲国产精品久久久久婷婷老年| 久久综合给合久久狠狠狠97色 | 久久人人爽人爽人人爽av| 久久福利青草精品资源站免费| 亚洲AV日韩AV天堂久久| 久久国语露脸国产精品电影| 久久99久久无码毛片一区二区| 香蕉久久一区二区不卡无毒影院 | 久久精品国产69国产精品亚洲| 久久精品国产99久久久古代 | 国产精品美女久久久免费| 伊人色综合久久| 国产精品美女久久久久AV福利| 久久精品9988| 久久99国产精品成人欧美| 狠狠综合久久综合中文88|