数组------数组中的逆序对

来源:互联网 发布:韩国女演员排行知乎 编辑:程序博客网 时间:2024/06/09 16:11

题目描述:
给定一个数组,求该数组中的逆序对的个数.
分析:
1. 最简单的方法是使用暴力枚举法.用双重循环,一一比对数组中的每个元素与排在他后面的所有元素,此方法的时间复杂度是O(n^2).

void func(vector<int>& data){    if(data.size() < 1)        return 0;    int count = 0;    for(int i = 0; i < data.size(); i++){        for(int j = i + 1; j < data.size(); j++){            if(data[i] > data[j])                count++;        }    }    return count;}
  1. 可用归并排序的方法,以降序的方式得到结果.具体来说,在前半部分的第i个元素与后半部分的第j个元素比较时,若arr[i] > arr[j],则就有逆序对个数为后半部分从j开始到结束的元素个数.(因为是降序,所以在arr[j]以后的元素肯定也比aee[i]小) 这样当使用二路归并把原来的数组按降序排好时,逆序对也就统计出来了.
long count = 0;int func(vector<int>& data){    if(data.size() < 1){        return 0;    }    MergeSort(data, 0. data.size() - 1);    return count;}void MergeSort(vector<int>& data, int first, int end){    if(first < end){        int mid = first + (end - first)/2;        MergeSort(data, first, mid);        MergeSort(data, mid + 1, end);        Merge(data, first, mid, end);    }}void Merge(vector<int>& data, int first, int mid, int end){    vector<int> tmp;    int i = first, m = mid, j = mid + 1, n = end;    while(i <= m && j <= n){        if(data[i] > data[j]){            tmp.push_back(data[i]);            count += n - j + 1; //由于是降序,当arr[i] > arr[j]时,arr[j]之后的元素也都小于arr[i],所以逆序对的数目就是从arr[j]开始到结束位置的元素个数即 n - j + 1 个.        }else{            tmp.push_back(arr[j]);        }    }    while(i <= m)        tmp.push_back(arr[i++]);    while(j <= n)        tmp.push_back(arr[j++]);    int k = 0;    while(int i = first; i <= end && k < tmp.size(); i++, k++)        data[i] = tmp[k];}
1 0
原创粉丝点击