歸併排序習題

2021-07-13 12:28:32 字數 1918 閱讀 7168

題一

題意:

輸入t組資料,每組資料第一行為n(共有2*n選手個數),r(回合次數),q(經過r回合第q名是誰)。第二行每個選手的初始分數。第三行,每個選手的能力(保證都不相同)。

每個回合都要對選手按照當前的分數進行排序。之後第a[i]個選手與第a[i + 1]個選手打。誰的能力強誰的分數加一,輸的一方分數不變。排序的時候按照分數的多少遞減,如果分數一樣則按照選手的序號及第i個選手遞增。

分析:此題直接模擬的話每次排序o(nlongn)*每次對打o(n),總時間複雜度o(n^2logn)大於10的10次方注定超時。

破題點是每次贏的人順序不變,輸的人順序也不變。

//注意排序時候用的 bool operator 和比較時的《是不同的要單獨的寫

#include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;

struct node

return score > t.score;

}} a[2000005],ying[2000005],shu[2000005];

int main()

for(int i = 0; i < 2*n; i ++)

sort(a,a + n * 2);

while(r--)

else

}//驚現歸併

int ii = 0,jj = 0;

int k = 0;

while(ii < ky && jj < ks)

else

}while(ii < ky)a[k ++] = ying[ii ++];

while(jj 題二

題意:就給t組資料長度為n的陣列,求陣列中有幾個逆序數

分析:裸歸併排序 + 左右陣列合併的時候當右陣列在比做陣列的數字小的時候出現逆序數,且逆序數的個數為當前左陣列的未遍歷的個數

//此題注意兩點 1.ans可能會超int

//2.合併兩個陣列的時候,每個需要將右側的陣列放在左邊的位置逆序對數都要+mid - i + 1;

//i = first時,逆序對數為整個左側陣列的長度 如左側陣列為 3 4 5,右側陣列為1 。逆序數為3(注first是第乙個數)

//i = first + 1時 左側陣列1 3 4 右側陣列2

//j位置的數比從當前位置到mid的數都笑這就意味著有mid - i + 1個逆序數

//與j的位置是無關的。因為表示的是當前位置右側陣列的某乙個數,與整個陣列所能產生的逆序數的個數

#include #include using namespace std;

long long ans = 0;

//將有二個有序數列a[first...mid]和a[mid...last]合併。

void mergearray(int a, int first, int mid, int last, int temp)//a表示待排序的陣列。first表示第乙個元素,last表示最後乙個元素

}while (i <= mid)

while (j <= last)

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)//a為待排序的陣列.first表示第乙個元素,last表示最後乙個元素

}int a[2000005];

int p[2000005];

int main()

mergesort(a, 0, n - 1, p);

cout<

歸併排序(2 路歸併排序)

遞迴寫法 include define maxn 100 void merge int a,int l1,int r1,int l2,int r2 將陣列a的區間 l1,r1 和區間 l2,r2 合併為乙個有序區間 else while i r1 while j r2 for int i 0 i非遞...

python歸併排序 python 歸併排序

排序思路 1.將陣列分成兩組a,b,建立臨時陣列 c,c長度 a b 2.i,j分別屬於a,b 3.若a i b j 將b j 放入c,j 否則 a i 放入c,i 4.迴圈3步驟,將a或b中剩餘的元素放入c,再將c複製到陣列中 5.遞迴3 4直到a,b序列的長度 1 歸併排序 class merg...

排序 歸併排序

歸併 merge 排序法是將兩個 或兩個以上 有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列。歸併 將兩個已經排好序的集合合併到乙個集合眾,並且保證新的集合也是有序的。核心點 只有乙個元素的集合是已經排好序的集合。歸併排序是建立在...