怎样建设公司的网站,网站做反向解析,免费软件漫画,公司网站应该包括哪些内容问题链接: AcWing 107. 超快速排序
问题描述 分析 这道题考查的算法不难#xff0c;就只是利用归并排序来求逆序对的数量#xff0c;但是主要是如何分析问题#xff0c;如何能从问题中看出来和逆序对数量有关#xff0c;现在的题目基本上很少是那种模板算法题了#xff…问题链接: AcWing 107. 超快速排序
问题描述 分析 这道题考查的算法不难就只是利用归并排序来求逆序对的数量但是主要是如何分析问题如何能从问题中看出来和逆序对数量有关现在的题目基本上很少是那种模板算法题了更注重思维所以一定要培养好思维模板只是基础。
这道题交换相邻的两个数首先会先想到冒泡排序冒泡排序就是交换相邻的两个数这道题用冒泡排序也能做但是冒泡排序时间复杂度是 O ( n 2 ) O(n^2) O(n2)的肯定过不了。我们思考冒泡排序在什么情况下会交换两个相邻的数目标是升序序列时当f[i]f[i1]时会交换f[i]与f[i1]交换后可以发现f[i]的逆序对数量减少了一个所以就能往这方面想最后可以发现逆序对的数量就是需要交换的最少次数。
思维很重要或者说在熟知算法模板的情况下更重要的就是思维了。 代码如下
#includecstdio
#includeiostream
#includealgorithm
#includecstring
using namespace std;
typedef long long ll;
const int N5e510;ll f[N];
ll tmp[N];
ll n,k;
void merge_sort(int l,int r){if(lr) return;int midlr1;merge_sort(l,mid);merge_sort(mid1,r);int il,jmid1,t0;while(imidjr)if(f[i]f[j]) tmp[t]f[i];else{tmp[t]f[j];kmid-i1;} while(imid) tmp[t]f[i];while(jr) tmp[t]f[j];for(int il;ir;i) f[i]tmp[i-l];
}
int main(){while(~scanf(%d,n)n){for(int i0;in;i) scanf(%lld,f[i]);k0;merge_sort(0,n-1);printf(%lld\n,k);}return 0;
}