題目內容:
在乙個n個數字的序列s裡,當s[i] > s[j] 且 i < j的時候,我們說(i ,j)是乙個逆序數對。
hint : 利用歸併排序法計算乙個序列裡有多少逆序數對。
hint : 思考一下在merge的過程,怎麼找到答案!
hint : 直接使用兩層迴圈來找答案的話會超過系統時間限制。
輸入格式:
只有一筆測資,第一行為乙個數字n,代表接下來有n行,每行有乙個數字。這n個數字都會相異。
數字範圍:
0 < n < 20000
輸出格式:
輸出一行數字,該序列的逆序數對個數。
輸入樣例:74
2615
30輸出樣例:
14時間限制:100ms記憶體限制:128000kb
#include
#include
int sum = 0;
void merge(int arr,int first,int mid,int last)
while((first1<=last1)&&(first2<=last2))else
}while(first1<=last1)
while(first2<=last2)
for(i=0;i
arr[first+i] = temp[i];
}free(temp);
}void mergesort(int arr,int first,int last)
}int main(void)
mergesort(arr,0,n-1);
printf("%d\n",sum);
return 0;
}
歸併排序法
之前覺得這個很難,後來看了一些部落格,理解了之後總算是懂了。算是之前的補充。並且今天筆試有排序演算法,正好做個記錄,加深映象 歸併排序的核心是分而治之,先分開,再兩兩合併,合併的時候調整順序。例如 待排序序列 4 8 5 3 9 6 2 4 第一次分 4 8 5 3 9 6 2 4 第二次分 4 8...
歸併排序法
合併排序 merge sort 是又一類不同的排序方法,合併的含義就是將兩個或兩個以上的有序資料序列合併成乙個新的有序資料序列,因此它又叫歸併演算法。它的基本思想就是假設陣列a有n個元素,那麼可以看成陣列a是又n個有序的子串行組成,每個子串行的長度為1,然後再兩兩合併,得到了乙個 n 2 個長度為2...
歸併排序法
void guibing int r,int temp,int s,int m,int t 陣列r的兩個連續的有序列,從第s到第m個,從第m 1到第t個,合併產生乙個有序列 從第s到第t else temp k r j while i m while j t 將剩餘的插入,只會進行兩個while中的...