POJ 2299 歸併排序

2021-09-01 01:55:42 字數 691 閱讀 6205

[img]

分析:統計給定序列中的逆序數,蠻力法複雜度達o(n^2)會超時,由於歸併排序複雜度為o(nlogn)

並且,在排序過程中可以順便統計逆序數,所以用歸併排序可以求出。

注意:在求逆序數時要注意,每當前半部分的數被加入到輔助陣列中時,逆序數總數應當增加後半部分已經被新增到輔助陣列中的元素的總個數.

#include

#include

//歸併排序統計

#define size 500010

int arr[size],t[size];

long long cnt = 0;

void mergesort(int *a,int *t,int l,int r)

else

else if(i<=mid&&j<=r&&a[i]>a[j])

else if(i<=mid&&j<=r&&a[i]<=a[j])

else if(i<=mid&&j>r)

}for(int i=l;i<=r;i++)

a[i] = t[i];}}

int main()

cnt = 0;

mergesort(arr,t,0,n-1);

printf("%i64d\n",cnt);

}return 0;

}

poj 2299 逆序數 歸併排序

陷阱啊!一開始我用氣泡排序 bubble sort 來統計。暈,tle。each case 50w.而一趟氣泡排序需要進行的是n 1,n 2,2,1,0的和次比較。即n n 1 2次。總的時間複雜度為o n 2 肯定是吃不消的。於是,可以用歸併排序來求它的逆序數,逆序即為它總共需要變換的次數。這樣時...

poj2299 歸併排序求逆序數

poj2299 逆序數 逆序數就是你如果只能交換臨近的兩個數,那麼將乙個序列變為有序序列所需要的最少交換次數 穩定的排序演算法按理來說都可以求,但通常使用歸併排序可以求逆序數,因為它的時間效率還是很高的,之所以遜於快排,還是因為它對空間的占用稍多,而且用到了迭代吧 提到逆序數我都第乙個想到歸併。思路...

POJ 2299 歸併排序求逆序數

poj 2299 用歸併排序來求,也是相似的道理,都是求在前面比自己大的數有幾個。歸併排序是穩定排序,所以可以這麼做 插入排序和希爾排序按理也可以,只是效率更沒那麼高 歸併排序在歸併兩個子段的時候,子段都是已經排好序的 因為回溯 相對位置在右邊的子段的元素如果小於相對位置在左邊的子段的元素,說明在原...