歸併排序是分治法(分而治之)的一種典型應用,應用遞迴的思想,自頂向下思考:先假定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 45using
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 34using
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 重點在於合併...