您好,欢迎来到画鸵萌宠网。
搜索
您的当前位置:首页逆序对个数(c语言)

逆序对个数(c语言)

来源:画鸵萌宠网

本一,初次写博客,如有错误欢迎指正

/*
题目要求是查出左边比右边数字大的sum情况(逆序对)
思路:
  运用归并排序思想,其思想每一次左右两大队列,是内部有序的
  所以说
  例子:
左     右
6      3
7      5
8      7

当右边出门时就证明他比左边指针所在位置要小,而左边是从小到大的
所以说他比左边现存的元素都要小  niuxu+=这些数
不用考虑重复因为每一次递归的话已经是把位置进行了调整

*/

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
int nixu=0;
void merge(int a[],int begin,int mid,int end)
{
    int result[100];
    int k=0;
    int i=begin;
    int j=mid+1;
    while(i<=mid&&j<=end)
    {
        if(a[i]<a[j])
        {
            result[k++]=a[i++];
        }
        else
        {
            nixu+=mid-i+1;
            result[k++]=a[j++];
        }
        if(i==mid+1)
        {
            while(j<=end)
            {
                result[k++]=a[j++];
            }
        }
        if(j==end+1)
        {
            while(i<=mid)
            {
                result[k++]=a[i++];
            }
        }
    }
    for(j=0,i=begin; j<k; j++,i++)
    {
        a[i]=result[j];
    }
}
void mergeSort(int a[],int begin,int end)
{
    if(begin>=end)
        return ;
    int mid=(begin+end)/2;
    mergeSort(a,begin,mid);
    mergeSort(a,mid+1,end);
    merge(a,begin,mid,end);

}

int main()
{
    int a[]= {37,40,48,90,32,5,12,3,44,13};
    int end=sizeof(a)/sizeof(a[0])-1;
    int begin =0;
    mergeSort(a,begin,end);
    printf("%d\n",nixu);
    return 0;
}


 

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo8.com 版权所有 湘ICP备2023022238号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务