归并排序法---题目

题目内容:

在一個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

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int sum = 0;
  4. void merge(int arr[],int first,int mid,int last){
  5. int first1 = first;
  6. int last1 = mid;
  7. int first2 = mid+1;
  8. int last2 = last;
  9. int i,index=0;
  10. int *temp;
  11. temp = (int *)malloc((last-first+1)*sizeof(int));
  12. if(temp == NULL){
  13. return;
  14. }
  15. while((first1<=last1)&&(first2<=last2)){
  16. if(arr[first1]<arr[first2]){
  17. temp[index++] = arr[first1++];
  18. }else{
  19. temp[index++] = arr[first2++];
  20. sum += (first2-frist) - index;  //尤其注意这一条语句
  21. }
  22. }
  23. while(first1<=last1){
  24. temp[index++] = arr[first1++];
  25. }
  26. while(first2<=last2){
  27. temp[index++] = arr[first2++];
  28. }
  29. for(i=0;i<index;i++){
  30. arr[first+i] = temp[i];
  31. }
  32. free(temp);
  33. }
  34. void mergesort(int arr[],int first,int last){
  35. int mid = 0;
  36. if(first<last){
  37. mid = (first+last)/2;
  38. mergesort(arr,first,mid);
  39. mergesort(arr,mid+1,last);
  40. merge(arr,first,mid,last);
  41. }
  42. }
  43. int main(void){
  44. int n;
  45. int j;
  46. int arr[200];
  47. scanf("%d\n",&n);
  48. for(j = 0; j<n; j++){
  49. scanf("%d",&arr[j]);
  50. }
  51. mergesort(arr,0,n-1);
  52. printf("%d\n",sum);
  53. return 0;
  54. }
时间: 2024-12-30 03:37:37

归并排序法---题目的相关文章

求逆序数模板(树状数组+离散化 || 归并排序法)

一篇不错的讲解:http://www.cnblogs.com/shenshuyang/archive/2012/07/14/2591859.html 代码如下:(树状数组+离散化) #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int maxn=500017; int n; int aa[maxn

归并排序法

归并排序法是将两个(或两个以上)的有序表合并成一个新的有序表.即把待排列的序列分成若干个子序列,每个子序列都是有序的,然后再把子序列合并成整体有序序列. 采用分治法 运用递归来完成 若出现卡死现象,一般为指针,或者scanf 或者whlie的使用错误!!!!! 其正确c语言编程如下: 1 #include<stdio.h> 2 3 //归并排序法 4 void merge(int a[],int b[],int start,int mid,int end); 5 void merge_sort

排序算法之--归并排序法

归并排序法 参考文章: https://www.cnblogs.com/chengxiao/p/6194356.html https://zh.wikipedia.org/wiki/%E5%BD%92%E5%B9%B6%E6%8E%92%E5%BA%8F 基本思想: 归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略. 分治法将问题分(divide)成一些小的问题后求解,而治(conquer)的阶段则将分的阶段得到的各

插入排序法---题目

题目内容: 實作插入排序法讓一個序列的數字遞增,並輸出數字總共交換了幾次. 比如說一個序列1 3 7 9 2,前四個數字都已經排好了,這時候第五個數字2進來,他必須跟9,7,3交換使得序列變成1 2 3 7 9.這個數字2的交換次數就是3次. 输入格式: 輸入第一行為一個數字T,代表測試資料的筆數.接下來有T筆測資,每筆測資第一行為一個正整數N,表示這筆測資有N個數字.每筆測資的第二行會有N個數字,每個數字間以空格隔開. 數字範圍: 0 < N <= 100 0 <= 序列內的數字 &l

利用归并排序法计算一个序列里有多少逆序对数(详细讲解)

前言 今天遇到求逆序对的问题,经过一番思索之后,特意来总结一下.因为也学习到了很多方法,以前自己一些百思不得其解的问题也有了解答. 正文 先上一个简单的问题: 分析:题目中说使用插入排序,也就是在排序过程中计算交换的次数,按照插入排序的原理,先定第一个,再定前两个的顺序,以此类推,只要交换了,我的次数就加一,但实际上,我们一直按照原始序列的顺序一直在往后走,所以(好,重点来了)我们要插入的就是前面比我大的数字前面的位置,也就是说,我需要交换的次数就是前面比我大的数字的个数,那么我考虑那就没必要进

归并排序法和基数排序法

归并排序法,这里介绍二路归并排序法,其他原理类似,只是更加复杂. 归并排序(Merge Sort)是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个有序的子序列,再把有序的子序列合并为整体有序序列. 归并排序的具体做法: 把原序列不断地递归等分,直至每等份只有一个元素,此时每等份都是有序的. 相邻等份合并,不断合并,直至合并完全. 二路归并 归并排序是建立在归并操作上的一种有效的排序算法.该算法是采用分治法(Divide and Conquer)的一个非常典型的应用.归并

算法导论第2章 分治法与归并排序, 二分查找法

分治策略:将原问题划分成n个规模较小而结构与原问题相似的子问题,然后递归地解决这些子问题,最后再合并其结果,就可以得到原问题的解. 它需要三个步骤: 分解:将原问题分解成一系列的子问题. 解决:递归地解决各个子问题.若子问题足够小,则直接求解. 合并:将子问题的结果合并成原问题的解. 通过分治策略和分治步骤,可以简单地默出归并算法. 分解:将n个元素分成各自包含n/2个元素的子序列 解决:用归并排序法递归地对两个子序列进行排序. 合并:合并两个以排序的子序列,得到排序结果: void merge

POJ 1804 Brainman(5种解法,好题,【暴力】,【归并排序】,【线段树单点更新】,【树状数组】,【平衡树】)

Brainman Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 10575   Accepted: 5489 Description BackgroundRaymond Babbitt drives his brother Charlie mad. Recently Raymond counted 246 toothpicks spilled all over the floor in an instant just b

C#和ASP.Net面试题目集锦

1.有哪几种方法可以实现一个类存取另外一个类的成员函数及属性,并请举列来加以说明和分析.2.A类是B类的基类,并且都有自己的构造,析构函数,请举例证明B类从实例化到消亡过程中构造,析构函数的执行过程.请附code3.什么叫应用程序域?什么是受管制的代码?什么是强类型系统?4..Net中读写数据库需要用到哪些类?他们的作用5.ASP.net的身份验证方式有哪些?分别是什么原理?6.解释一下UDDI.WSDL的意义及其作用.7.常用的调用webservice方法有哪些?8.讲一讲你理解的web se