經(jīng)典算法應(yīng)用之一----歸并排序(微軟筆試題)

首先來看看原題

微軟2010年筆試題
在一個排列中殃姓,如果一對數(shù)的前后位置與大小順序相反掏导,即前面的數(shù)大于后面的數(shù)对供,那么它們就稱為一個逆序數(shù)對逾苫。一個排列中逆序的總數(shù)就稱為這個排列的逆序數(shù)。如{2柬帕,4哟忍,3狡门,1}中,2和1锅很,4和3其馏,4和1,3和1是逆序數(shù)對爆安,因此整個數(shù)組的逆序數(shù)對個數(shù)為4叛复,現(xiàn)在給定一數(shù)組,要求統(tǒng)計出該數(shù)組的逆序數(shù)對個數(shù)扔仓。

計算數(shù)列的逆序數(shù)對個數(shù)最簡單的方便就最從前向后依次統(tǒng)計每個數(shù)字與它后面的數(shù)字是否能組成逆序數(shù)對褐奥。代碼如下:

#include <stdio.h>  
int main()  
{      
    const int MAXN = 8;  
    int a[MAXN] = {1, 7, 2, 9, 6, 4, 5, 3};  
      
    int nCount = 0;  
    int i, j;  
    for (i = 0; i < MAXN; i++)  
        for (j = i + 1; j < MAXN; j++)  
            if (a[i] > a[j])  
                nCount++;  
  
    printf("逆序數(shù)對為: %d\n", nCount);  
}  

運(yùn)行結(jié)果如下:

這種方法用到了雙循環(huán),時間復(fù)雜度為O(N^2)当辐,是一個不太優(yōu)雅的方法抖僵。因此我們嘗試用其它方法來解決鲤看。

在《經(jīng)典算法系列之五歸并排序的實現(xiàn)》中觀察歸并排序——合并數(shù)列(1缘揪,3,5)與(2义桂,4)的時候:
1.先取出前面數(shù)列中的1找筝。
2.然后取出后面數(shù)列中的2,明顯慷吊!這個2和前面的3袖裕,5都可以組成逆序數(shù)對即3和2,5和2都是逆序數(shù)對溉瓶。
3.然后取出前面數(shù)列中的3急鳄。
4.然后取出后面數(shù)列中的4,同理堰酿,可知這個4和前面數(shù)列中的5可以組成一個逆序數(shù)對疾宏。
這樣就完成了逆序數(shù)對的統(tǒng)計,歸并排序的時間復(fù)雜度是O(N * LogN)触创,因此這種從歸并排序到數(shù)列的逆序數(shù)對的解法的時間復(fù)雜度同樣是O(N * LogN)坎藐,下面給出代碼:

//從歸并排序到數(shù)列的逆序數(shù)對  
#include <stdio.h> 
int g_nCount;  
void mergearray(int a[], int first, int mid, int last, int temp[])  
{  
    int i = first, j = mid + 1;  
    int m = mid,   n = last;  
    int k = 0;  
  
    while (i <= m && j <= n) //a[i] 前面的數(shù)  a[j] 后面的數(shù)  
    {  
        if (a[i] < a[j])  
            temp[k++] = a[i++];  
        else  
        {  
            temp[k++] = a[j++];  
            //a[j]和前面每一個數(shù)都能組成逆序數(shù)對  
            g_nCount += m - i + 1;  
        }  
    }  
  
    while (i <= m)  
        temp[k++] = a[i++];  
  
    while (j <= n)  
        temp[k++] = a[j++];  
  
    for (i = 0; i < k; i++)  
        a[first + i] = temp[i];  
}  
void mergesort(int a[], int first, int last, int temp[])  
{  
    if (first < last)  
    {  
        int mid = (first + last) / 2;  
        mergesort(a, first, mid, temp);    //左邊有序  
        mergesort(a, mid + 1, last, temp); //右邊有序  
        mergearray(a, first, mid, last, temp); //再將二個有序數(shù)列合并  
    }  
}  
  
bool MergeSort(int a[], int n)  
{  
    int *p = new int[n];  
    if (p == NULL)  
        return false;  
    mergesort(a, 0, n - 1, p);  
    return true;  
}  
  
int main()  
{  
    printf("     從歸并排序到數(shù)列的逆序數(shù)對 \n");          
  
    const int MAXN = 8;  
    int a[MAXN] = {1, 7, 2, 9, 6, 4, 5, 3};  
  
    g_nCount = 0;  
    MergeSort(a, MAXN);  
    printf("逆序數(shù)對為: %d\n", g_nCount);  
    return 0;  
}  

運(yùn)行結(jié)果:


推薦閱讀:
經(jīng)典算法應(yīng)用之一----歸并排序(微軟筆試題)
經(jīng)典算法應(yīng)用之二----基數(shù)排序(google筆試題)
經(jīng)典算法應(yīng)用之三----應(yīng)用二中題目的升華
經(jīng)典算法應(yīng)用之四(上)---基本位操作之算法篇
經(jīng)典算法應(yīng)用之四(中)---基本位操作之算法篇
經(jīng)典算法應(yīng)用之四(下)---百度面試題
經(jīng)典算法應(yīng)用之五---隨機(jī)生成和為S的N個正整數(shù)
經(jīng)典算法應(yīng)用之六---過橋問題和過河問題
經(jīng)典算法應(yīng)用之七----10億數(shù)據(jù)中取最大的100個數(shù)據(jù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市哼绑,隨后出現(xiàn)的幾起案子岩馍,更是在濱河造成了極大的恐慌,老刑警劉巖抖韩,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蛀恩,死亡現(xiàn)場離奇詭異,居然都是意外死亡茂浮,警方通過查閱死者的電腦和手機(jī)赦肋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進(jìn)店門块攒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人佃乘,你說我怎么就攤上這事囱井。” “怎么了趣避?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵庞呕,是天一觀的道長。 經(jīng)常有香客問我程帕,道長住练,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任愁拭,我火速辦了婚禮讲逛,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘岭埠。我一直安慰自己盏混,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布惜论。 她就那樣靜靜地躺著许赃,像睡著了一般。 火紅的嫁衣襯著肌膚如雪馆类。 梳的紋絲不亂的頭發(fā)上混聊,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天,我揣著相機(jī)與錄音乾巧,去河邊找鬼句喜。 笑死,一個胖子當(dāng)著我的面吹牛沟于,可吹牛的內(nèi)容都是我干的咳胃。 我是一名探鬼主播,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼社裆,長吁一口氣:“原來是場噩夢啊……” “哼拙绊!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起泳秀,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤标沪,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后嗜傅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體金句,經(jīng)...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年吕嘀,在試婚紗的時候發(fā)現(xiàn)自己被綠了违寞。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贞瞒。...
    茶點故事閱讀 39,739評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖趁曼,靈堂內(nèi)的尸體忽然破棺而出军浆,到底是詐尸還是另有隱情,我是刑警寧澤挡闰,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布乒融,位于F島的核電站,受9級特大地震影響摄悯,放射性物質(zhì)發(fā)生泄漏赞季。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一奢驯、第九天 我趴在偏房一處隱蔽的房頂上張望申钩。 院中可真熱鬧,春花似錦瘪阁、人聲如沸撒遣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽愉舔。三九已至钢猛,卻和暖如春伙菜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背命迈。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工贩绕, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人壶愤。 一個月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓淑倾,卻偏偏與公主長得像,于是被迫代替她去往敵國和親征椒。 傳聞我的和親對象是個殘疾皇子娇哆,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,647評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 一. 寫在前面 要學(xué)習(xí)算法,“排序”是一個回避不了的重要話題勃救,在分析完并查集算法和常用數(shù)據(jù)結(jié)構(gòu)之后碍讨,今天我們終于可...
    Leesper閱讀 2,531評論 0 40
  • 本文主要整理了九種經(jīng)典的內(nèi)部排序算法。 1.冒泡排序 原理: 冒泡排序是一種簡單的排序算法蒙秒。它重復(fù)地走訪過要排序的...
    愛聽故事的人想會講故事閱讀 1,183評論 0 2
  • Ba la la la ~ 讀者朋友們勃黍,你們好啊,又到了冷鋒時間晕讲,話不多說覆获,發(fā)車马澈! 1.冒泡排序(Bub...
    王飽飽閱讀 1,794評論 0 7
  • 昨夜下起了一場瓢潑大雨,雨幕被風(fēng)吹得不斷改變傾注方向,忽而如矢撲來使躲閃不及的路人衣衫盡濕,引起男生宿舍樓的一陣陣...
    邀月成三閱讀 410評論 0 0
  • 本周的主題有點讓人振奮。之前根本就沒有這個方面的思考弄息,那怕是去了解都沒有過痊班。很多事情它就是客觀的存在在某個地方,你...
    RexsonXie閱讀 214評論 0 0