剑指offer 35 数组中的逆序对

1: 遍历,只要前面的值大于后面的一个值,就加1;

2 : 冒泡排序,交换一次,就+1;

3: 归并排序:

#include <iostream>
#include <vector>
using namespace std;

class solution
{
public:

    //暴力,遍历
    int Inverspairs(vector<int> array) {
        int all = array.size();
        if (all == 0 || all < 2){
            return 0;
        }
        int number = 0;
        for (int i = 0; i < all; i++) {
            for (int j = i + 1; j < all; j++) {
                if (array[i] > array[j]) {
                    number = number + 1;//前值大就+1

                }
            }
        }
        return number;
    }

    //冒泡排序,交换即一个逆序对
    int Inverspairs2(vector<int> element) {

        if (element.size() == 0 || element.size() < 2){
            return 0;
        }

        return bubble_sort(element);
    }
    int bubble_sort(vector<int> array) {
            int all = array.size();
            int count = 0;
            if (array.empty() != 0 || all <2){//all == 0
                return 0;
            }
            for (int end = all -1; end > 0; end--)//end--
                for (int i = 0 ; i < end ; i++ ){
                    if ( array[i] > array[i+1] ) {//前面大于后面的就交换
                       int temp = array[i];
                       array[i] = array[i+1];
                       array[i+1] = temp;
                       count++;
                }
            }
            for(int i=0; i < array.size(); ++i) {
                cout << array[i] << endl;
            }
            return count;

        }

    //归并逆序对
    int InversPairs3(vector<int> elem) {
        if (elem.size() == 0) {
            return 0;
        }
        vector<int> temp(elem.size());//创建一个空数组,有初始化
        int count = InversPairs3Score(elem, 0, elem.size() - 1, temp);//调用统计
        return count;
    }


    int MergeElem(vector<int> &elem, int start, int mid, int end, vector<int> &temp){
        //传引用,改变实参
        int i = mid;//两个数组归并
        int j = end;
        int k = 0;
        int count = 0;
        while (i >= start && j > mid) {
            if (elem[i] > elem[j]) {
                temp[k++] = elem[i--];//大的排前边
                count += j - (mid+1) + 1;//大就统计
            }
            else {
                temp[k++] = elem[j--];
            }
        }
        cout << "count = " << count << endl;
        while (i >= start){
            temp[k++] = elem[i--];
        }
        while (j > mid) {
            temp[k++] = elem[j--];
        }
        // temp 从大往小的顺序
        for (int i = 0; i < k; i++) {
            elem[end - i] = temp[i];
        }
        //copy(elem.begin(), elem.end(), ostream_iterator<int>(cout," "));
        for (int i = 0; i < elem.size(); i++)
        {
            cout << elem[i] << endl;
        }
        return count;
    }


    int InversPairs3Score(vector<int> &elem, int start, int end, vector<int> &temp) {
        //&传引用,改变实参
        int inversions = 0;
        if (start < end) {
            int mid = (start + end)/2;
            inversions += InversPairs3Score(elem, start, mid, temp);//左部分
            inversions += InversPairs3Score(elem, mid+1, end, temp);//右部分
            inversions += MergeElem(elem, start, mid, end, temp);//实参

        }
        return inversions;

     }


};


int main()
{
    int a1[] = { 6, 5, 4 , 7, 2, 3, 4};
    vector<int> vec(a1, a1+7);

    solution s;
    //cout << s.Inverspairs(vec) << endl;
    //cout << s.Inverspairs2(vec) << endl;
    cout << s.InversPairs3(vec) << endl;

    return 0;
}

猜你喜欢

转载自blog.csdn.net/liufanlibashanxi/article/details/85224936