1 solutions
-
0
C :
#include <stdio.h> #include <stdlib.h> int a[500001],t[500001]; long long sum; void Merge(int l,int m,int r) { int p=0; int i=l,j=m+1; while(i<=m&&j<=r) { if(a[i]>a[j]) { t[p++]=a[j++]; sum+=m-i+1; } else t[p++]=a[i++]; } while(i<=m) t[p++]=a[i++]; while(j<=r) t[p++]=a[j++]; for(i=0;i<p;i++) a[l+i]=t[i]; } void MergeSort(int l,int r) { int m; if(l<r) { m=(l+r)/2; MergeSort(l,m); MergeSort(m+1,r); Merge(l,m,r); } } int main() { int n,i; while(scanf("%d",&n)!=EOF,n) { sum=0; for(i=0;i<n;i++) scanf("%d",&a[i]); MergeSort(0,n-1); printf("%lld\n",sum); } return 0; }
C++ :
#include <stdio.h> #include <stdlib.h> int a[500001],t[500001]; long long sum; void Merge(int l,int m,int r) { int p=0; int i=l,j=m+1; while(i<=m&&j<=r) { if(a[i]>a[j]) { t[p++]=a[j++]; sum+=m-i+1; } else t[p++]=a[i++]; } while(i<=m) t[p++]=a[i++]; while(j<=r) t[p++]=a[j++]; for(i=0;i<p;i++) a[l+i]=t[i]; } void MergeSort(int l,int r) { int m; if(l<r) { m=(l+r)/2; MergeSort(l,m); MergeSort(m+1,r); Merge(l,m,r); } } int main() { int n,i; while(scanf("%d",&n)!=EOF,n) { sum=0; for(i=0;i<n;i++) scanf("%d",&a[i]); MergeSort(0,n-1); printf("%lld\n",sum); } return 0; }
Java :
/** * @(#)Main.java * * * @author * @version 1.00 2013/11/28 */ import static java.lang.System.*; import java.util.Scanner; import java.util.ArrayList; import java.util.*; public class Main { static long count=0;//统计交换次数 static int[] B = new int[500001]; static int[] A = new int[500001]; public static void main(String[] args) { Scanner in=new Scanner(System.in); while(in.hasNextInt()) { count=0; int n=in.nextInt(); if(n==0) break; //int[] num = new int[n]; //int[] num = A; for(int i=0;i<n;i++) A[i]=in.nextInt(); guiBing(0, n-1); System.out.println(count); } } public static void sort_method(int p, int q, int r) {//把两个已经排好的子数组进行合并排序 int A_length=r-p+1; //int[] B=new int[A.length]; int i=p,j=q+1,k=0; while(i<=q&&j<=r) { if(A[i]>A[j]) { B[k++]=A[j++]; count+=q-i+1; } else B[k++]=A[i++]; } while(i<=q) B[k++]=A[i++]; while(j<=r) B[k++]=A[j++]; for(int h=0;h<k;h++) A[h+p]=B[h]; } public static void guiBing(int p,int r) {//递归划分数组为两个子数组 if(p<r){ int q=(p+r)/2; guiBing(p,q); guiBing(q+1,r); sort_method(p,q,r); } } }
- 1
Information
- ID
- 623
- Time
- 1000ms
- Memory
- 32MiB
- Difficulty
- (None)
- Tags
- # Submissions
- 0
- Accepted
- 0
- Uploaded By