找分割點:找將陣列分為左右兩個區間的標記元素,一般取陣列中間的元素。
遞迴:對左右兩各區間的陣列元素分別進行歸併排序,使之有序。
將排好序的左右兩個陣列進行歸併 使用temp陣列來儲存排好序的元素
將temp陣列中的元素寫回到原陣列中
給定你乙個長度為n的整數數列。
請你使用歸併排序對這個數列按照從小到大進行排序。
並將排好序的數列按順序輸出。
輸入格式
輸入共兩行,第一行包含整數 n。
第二行包含 n 個整數(所有整數均在1~10^9範圍內),表示整個數列。
輸出格式
輸出共一行,包含 n 個整數,表示排好序的數列。
資料範圍
1≤n≤100000
輸入樣例:
53 1 2 4 5
輸出樣例:
1 2 3 4 5
難度:簡單
時/空限制:1s / 64mb
#includeusing namespace std;
const int n = 100100;
int v[n];
int temp[n];
int n;
void merge_sort(int v, int left, int right)
while(i <= mid)
temp[k++] = v[i++];
while(j <= right)
temp[k++] = v[j++];
for(i = left, j = 0; i <= right; i++, j++)
v[i] = temp[j];
}int main()
給定乙個長度為n的整數數列,請你計算數列中的逆序對的數量。
逆序對的定義如下:對於數列的第 i 個和第 j 個元素,如果滿足 i < j 且 a[i] > a[j],則其為乙個逆序對;否則不是。
輸入格式
第一行包含整數n,表示數列的長度。
第二行包含 n 個整數,表示整個數列。
輸出格式
輸出乙個整數,表示逆序對的個數。
資料範圍
1≤n≤100000
輸入樣例:
62 3 4 5 6 1
輸出樣例:
5利用歸併排序來計算逆序對的數量,逆序對有三種情況,見圖1.1.
第1,2種情況可由函式返回值來返回,重點是第三種情況,第三種情況返回到上一級函式中便是第一或第二種情況,歸併排序函式是一種遞迴的函式。詳情見下方逆序對題解中的merge_sort()函式。
如圖1.1:第三種情況中,當v[i] > v[j]時,下標從i到j這段陣列中的所有元素都與v[j]構成了逆序對,數量為mid - i + 1;
由此,我們可以來寫我們的**:
#includeusing namespace std;
const int n = 1e5 + 10;
int v[n],temp[n];
long long merge_sort(int v, int left, int right)
}//掃尾
while(i <= mid)
temp[k++] = v[i++];
while(j <= right)
temp[k++] = v[j++];
//物歸原主
for(int i = left, j = 0; i <= right; i++, j++)
v[i] = temp[j];
return res;
}int main()
Acwing 787 歸併排序
歸併排序步驟 1.確定分界點 按照中間位置分為兩段 2.遞迴處理兩段區間 3.合併兩段處理後有序區間 歸併 include using namespace std const int maxn 100005 int value maxn int temp maxn 臨時儲存合併陣列 歸併排序 voi...
Acwing 787 歸併排序
給定你乙個長度為n的整數數列。請你使用歸併排序對這個數列按照從小到大進行排序。並將排好序的數列按順序輸出。輸入格式 輸入共兩行,第一行包含整數 n。第二行包含 n 個整數 所有整數均在1 109109範圍內 表示整個數列。輸出格式 輸出共一行,包含 n 個整數,表示排好序的數列。資料範圍 1 n 1...
歸併排序模板 ACwing 787
歸併排序其實也是分治的思想 首先歸併排序跟快排一樣同樣需要考慮分界點 歸併排序的分界點都是取中間值 其次歸併排序需要遞迴排序左邊和右邊 最後一部也是最難的一部需要將分開的歸併排序合二為一 includeusing namespace std intn const int n 100010 int a...