笔记1--逆序对(归并排序)

来源:互联网 发布:俞永福 知乎 编辑:程序博客网 时间:2024/05/21 16:54

逆序对:

  设A[1...n]是一个包含n个不同数的数组。如果在i〈j的情况下,有A[i]〉A[j],则(i,j)就称为A中的一个逆序对(inversion)。

#include <stdio.h>int sum = 0;void merge(int *arr, int left, int middle, int right){int i,j,k;int m=middle-left+1;int n=right-middle;int a[100],b[100];for(i=0;i<m;i++)a[i]=arr[left+i];for(j=0;j<n;j++)b[j]=arr[middle+j+1];a[m]=100;b[n]=100;i=0;j=0;for(k=left;k<=right;k++)if(a[i]<b[j])arr[k]=a[i++];else{arr[k]=b[j++];sum+=middle-(left+i)+1;}}void mergesort(int *arr,int left,int right){int middle=(left+right)/2;if(left<right){mergesort(arr,left,middle);mergesort(arr,middle+1,right);merge(arr,left,middle,right);}}//测试:int main(){int i;int arr[] = {9,8,7,6,5,4,3,2,1,0};int len=sizeof(arr)/sizeof(int);mergesort(arr, 0, len-1);printf("%d\n", sum);for (i = 0; i<len; i++)printf("%d ", arr[i]);return 0;}