首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

POJ 2299 Ultra-QuickSort:歸並排序計算逆序數

     編輯:關於C++

問題描述

給定長度 n < 500,000 的排列,求將其排序所需的最少相鄰交換次數(即逆序數)。多測試用例,n=0 結束。

歸並排序求逆序數

  • 遞歸分解區間 [l, r] 為 [l, mid] 和 [mid+1, r]。
  • 合併時,左右子區間已有序。若 a[i] > a[j](i 在左,j 在右),則 a[i..mid] 都大於 a[j],產生 mid - i + 1 個逆序對。
  • 累加各層逆序數即為總逆序數。

代碼


const int MAX = 500005;
int a[MAX]; long long ans;
void merge(int l, int mid, int r) {
    int i=l, j=mid+1;
    while(i<=mid && j<=r) {
        if(a[i] <= a[j]) i++;
        else { j++; ans += mid - i + 1; }
    }
    sort(a+l, a+r+1); // 或手寫 merge 到臨時數組再拷回
}
void merge_sort(int l, int r) {
    if(l

優化建議

  • 用臨時數組手寫 merge 避免 sort 的 O(n log n) 開銷,將合併降為 O(n),總體 O(n log n)。
  • long long 存儲答案(最大 ~1.25e11)。
  • 輸入量大,建議用快速 IO。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved