归并排序法---题目
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了归并排序法---题目相关的知识,希望对你有一定的参考价值。
题目内容:
在一個N個數字的序列S裡,當S[i] > S[j] 且 i < j的時候,我們說(i ,j)是一個逆序數對。
Hint : 利用歸併排序法計算一個序列裡有多少逆序數對。
Hint : 思考一下在merge的過程,怎麼找到答案!
Hint : 直接使用兩層迴圈來找答案的話會超過系統時間限制。
输入格式:
只有一筆測資,第一行為一個數字N,代表接下來有N行,每行有一個數字。這N個數字都會相異。
數字範圍:
0 < N < 20000
输出格式:
輸出一行數字,該序列的逆序數對個數。
输入样例:
7
4
2
6
1
5
3
0
输出样例:
14
时间限制:100ms内存限制:128000kb
- #include <stdio.h>
- #include <stdlib.h>
- int sum = 0;
- void merge(int arr[],int first,int mid,int last){
- int first1 = first;
- int last1 = mid;
- int first2 = mid+1;
- int last2 = last;
- int i,index=0;
- int *temp;
- temp = (int *)malloc((last-first+1)*sizeof(int));
- if(temp == NULL){
- return;
- }
- while((first1<=last1)&&(first2<=last2)){
- if(arr[first1]<arr[first2]){
- temp[index++] = arr[first1++];
- }else{
- temp[index++] = arr[first2++];
- sum += (first2-frist) - index; //尤其注意这一条语句
- }
- }
- while(first1<=last1){
- temp[index++] = arr[first1++];
- }
- while(first2<=last2){
- temp[index++] = arr[first2++];
- }
- for(i=0;i<index;i++){
- arr[first+i] = temp[i];
- }
- free(temp);
- }
- void mergesort(int arr[],int first,int last){
- int mid = 0;
- if(first<last){
- mid = (first+last)/2;
- mergesort(arr,first,mid);
- mergesort(arr,mid+1,last);
- merge(arr,first,mid,last);
- }
- }
- int main(void){
- int n;
- int j;
- int arr[200];
- scanf("%d\n",&n);
- for(j = 0; j<n; j++){
- scanf("%d",&arr[j]);
- }
- mergesort(arr,0,n-1);
- printf("%d\n",sum);
- return 0;
- }
以上是关于归并排序法---题目的主要内容,如果未能解决你的问题,请参考以下文章
2022下半年 Acwing 第四篇:AcWing 787. 归并排序