目录
线性排序——计数排序
to be continue…
逆序数对——归并排序
首先了解一下什么叫做逆序数对,抄一段百度
ok,现在我们的代码需求是求出一个数列的逆序数对数,不同于暴力求解的双遍历O(n^2)的时间复杂度,这里我们可以利用归并排序的一个特性很精妙地求解出逆序数。
#include <iostream>
using namespace std;
const int Max = 1000 + 10;
int arr[Max];
int temp[Max];
void Combine(int left, int middle, int right) {
int i = left;
int j = middle + 1;
int k = left;
while (i <= middle && j <= right) {
if(arr[i] <= arr[j]){
temp[k++] = arr[i++];
} else{
temp[k++] = arr[j++];
}
}
while (i <= right){
temp[k++] = arr[i++];
}
while (j <= right){
temp[k++] = arr[j++];
}
for(k = left; k <= right; k++){
arr[k] = temp[k];
}
}
void MergeSort(int left, int right){
if(left < right){
int middle = left + (right - left) / 2;
MergeSort(left, middle);
MergeSort(middle + 1, right);
Combine(left,middle,right);
}
}
int main() {
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
MergeSort(0, n - 1);
for (int i = 0; i < n; i++) {
printf("%d", arr[i]);
}
printf("\n");
return 0;
}