歸並排序求逆序對


給定數組 如{5,8,3,1}   則有<5,3><5,1><8,3><8,1><3,1> 5個逆序對 

給定數組 求其逆序對的個數

思路:歸並排序   O(NlogN) 時間復雜度   O(N) 空間復雜度

代碼:

int num = 0;        //逆序對個數
void mergg(int ar[],int low,int mid,int high)
{
    int* b = new int[high + 1];           //b[] 復制 ar[]
    for (int i = low;i <= high;++i)
    {
        b[i] = ar[i];
    }
    int i = low,j = mid + 1,k = low;
    while (i <= mid&&j <= high)
    {
        if (b[i] <= b[j])
        {
            ar[k++] = b[i++];
        }
        else
        {
            ar[k++] = b[j++];
            num += mid - i + 1;       //發生逆序,此時由於
            //a[i..m]是已經有序了,那么a[i+1], a[i+2], ... a[m]都是大於a[j]的,
            //都可以和a[j]組成逆序對,因此number += m - i + 1
        }
    }
    while (i <= mid){ ar[k++] = b[i++]; }     //這兩種情況只會發生一種
    while (j <= high){ ar[k++] = b[j++]; }    //
    delete []b;
}
void merge_sort(int ar[],int low,int high)  //二路歸並排序
{
    if (low < high)
    {
        int mid = low + (high - low)/2;
        merge_sort(ar,low,mid);
        merge_sort(ar,mid + 1,high);
        mergg(ar,low,mid,high);
    }
}

PS:  還是基礎最重要 掌握扎實的基礎才是王道


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM