zoukankan      html  css  js  c++  java
  • 归并排序求数组逆序对数

    #include <iostream>
    
    using namespace std;
    
    const int LENGTH = 100;
    int temp[LENGTH];
    int count = 0;
    
    void Merge(int array[], int low, int mid, int high);
    void MergeSort(int array[], int low, int high);
    
    /**
     * 合并两个数组[low, mid],(mid, high]到数组[low, high]
     * @param array 待排序数组
     * @param low   起始下标
     * @param mid   分界线
     * @param high  终止下标
     */
    void Merge(int array[], int low, int mid, int high)
    {
        int tempIndex = low;
        int leftIndex = low;
        int rightIndex = mid + 1;
    
        while(leftIndex <= mid && rightIndex <= high)
        {
            if(array[leftIndex] < array[rightIndex])
            {
                temp[tempIndex++] = array[leftIndex++];
            }
            else // array[rightIndex]要比[leftIndex, mid]的元素都小,逆序对由此产生
            {
                temp[tempIndex++] = array[rightIndex++];
                count += (mid - leftIndex + 1);
            }
        }
    
        while(leftIndex <= mid)
        {
            temp[tempIndex++] = array[leftIndex++];
        }
    
        while(rightIndex <= high)
        {
            temp[tempIndex++] = array[rightIndex++];
        }
    
        for(int i = low; i <= high; ++i)
        {
            array[i] = temp[i];
        }
    }
    
    void MergeSort(int array[], int low, int high)
    {
        if(low == high) return;
    
        int mid = (low + high) / 2;
        MergeSort(array, low, mid);
        MergeSort(array, mid + 1, high);
        Merge(array, low, mid, high);
    }
    
    int main()
    {
        int array[] = {0, 4, 2, 6, 12, 10, 8, 7, 5};
        MergeSort(array, 0, 8);
    
        for(auto val : array)
        {
            cout << val << " ";
        }
        cout << endl;
        cout << "--------------------------" << endl;
        cout << count << endl;
    
        return 0;
    }
    View Code

    说明:需要编译器支持C++11

    PS C:UsersAdministratorDesktopcodes> g++ -o .InverseNumber.exe .InverseNumber.cpp -std=c++11
    PS C:UsersAdministratorDesktopcodes> .InverseNumber.exe
    0 2 4 5 6 7 8 10 12
    --------------------------
    12
    PS C:UsersAdministratorDesktopcodes> g++ -v
    Using built-in specs.
    COLLECT_GCC=F:GreenSoftwareCodeBlocksTDM-GCCing++.exe
    COLLECT_LTO_WRAPPER=F:/GreenSoftware/CodeBlocks/TDM-GCC/bin/../libexec/gcc/mingw32/5.1.0/lto-wrapper.exe
    Target: mingw32
    Configured with: ../../../src/gcc-5.1.0/configure --build=mingw32 --enable-languages=ada,c,c++,fortran,lto,objc,obj-c++
    --enable-libgomp --enable-lto --enable-graphite --enable-libstdcxx-debug --enable-threads=posix --enable-version-specifi
    c-runtime-libs --enable-fully-dynamic-string --enable-libstdcxx-threads --enable-libstdcxx-time --with-gnu-ld --disable-
    werror --disable-nls --disable-win32-registry --disable-symvers --enable-cxx-flags='-fno-function-sections -fno-data-sec
    tions -DWINPTHREAD_STATIC' --prefix=/mingw32tdm --with-local-prefix=/mingw32tdm --with-pkgversion=tdm-1 --enable-sjlj-ex
    ceptions --with-bugurl=http://tdm-gcc.tdragon.net/bugs
    Thread model: posix
    gcc version 5.1.0 (tdm-1)
    PS C:UsersAdministratorDesktopcodes>
  • 相关阅读:
    cisco route 831 IOS 备份升级ISO
    活动目录灾难恢复计划
    转载:IPsec的故障诊断与维修
    IPSEC结构
    诺基亚手机的安全保护。如何使你的手机丢失,被盗后依然安全。
    windows xp 同步故障:Unable to merge offline changes on \\ server_name \ share_name . The parameter is incorrect
    Google chart
    IPSEC的NAT兼容性
    Tom围棋(弈城围棋)运行错误:当前运行的版本是系统无法识别的版本
    IPSec NATT
  • 原文地址:https://www.cnblogs.com/fengkang1008/p/4728312.html
Copyright © 2011-2022 走看看