歸併排序求逆序數

2022-06-06 02:00:14 字數 1397 閱讀 1193

歸併排序是分治法(分而治之)的一種典型應用,應用遞迴的思想,自頂向下思考:先假定mergesort()可以將乙個亂序的陣列排好序,因此就可以開始"分"(將乙個陣列平均分成兩部分),再"治"(分別對前後部  分呼叫mergesort()使它們有序),最後再寫乙個合併子函式combine(),它可以將兩個有序的陣列合併,combine()實現起來比較容易.只需要管理兩個指標,分別指向兩個子陣列的開頭,開闢新記憶體儲存中間結 果,遍歷完兩個陣列就可以完成,時間是θ(n).

假定n個元素的陣列呼叫mergesort()需要時間t(n).因此,t(n)=2t(n/2)+θ(n).由主定理可知:t(n)=θ(nlogn).歸併排序演算法的時間複雜度是θ(nlogn),空間複雜度是θ(n).

**如下:

1 # include 2 # include 3 # include 4

5using

namespace

std;67

int arr[100];8

int temp[100];9

int number = 0;10

//合併函式。

11void combine(int left,int middle,int

right)else22}

23while(i <=middle)

26while(j <=right)

29for(int m=left; m<=right; m++)

32return;33

}3435void mergersort(int left,int

right)

42return;43

} 44

intmain()

50 mergersort(0,n-1

);51

for(int j=0; j)

5455 printf("\n"

);56 printf("

%d\n

",number); 57}

58 }

當然求逆序數也可以暴力求解,直接雙重迴圈,此時演算法複雜度為o(n2),廢話不多說**如下:

1 # include 2 # include 3

4using

namespace

std;

5int

number;

6int arr[100];7

intmain ()

14for(int i=0; i)

15for(int j=i; j)19}

20 printf("

%d\n

",number);

2122

}23 }

顯然暴力求解**量少,但是歸併排序的效率更高。

求逆序數 逆序數 歸併排序

求排列的逆序數 分治 一 題目描述 總時間限制 1000ms 記憶體限制 65536kb 描述 在internet上的搜尋引擎經常需要對資訊進行比較,比如可以通過某個人對一些事物的排名來估計他 或她 對各種不同資訊的興趣,從而實現個性化的服務。對於不同的排名結果可以用逆序來評價它們之間的差異。考慮1...

歸併排序 求逆序數

首先需要了解逆序對的概念 如果在乙個序列 數列中,滿足 則ax和ay稱為一對逆序對。現在考慮乙個問題 對乙個大小為n 即有n個元素 元素隨機無序且唯一的整數序列中,平均有多少個逆序對?乙個構造證明的方法如下 設乙個隨機無序且元素唯一的整數序列為 我們令lr為l的反向序列,即 然後在lr中任取兩個數,...

歸併排序求逆序數

輸入 n 陣列中元素個數 x 最後所存在的每對逆序對所需要花費的錢 y 按任意順序交換陣列中相鄰兩個元素所要花費的錢 n個陣列中元素 輸出 求使陣列變為公升序所需要的最少 即求該陣列的逆序數 按陣列順序 任意順序交換次數均為該陣列的逆序數次 歸併排序求逆序數 歸併排序採用分治策略 ex 重點在於合併...