#include <stdio.h>
#include<stdlib.h>
static void merge(int *array, int start, int mid, int end, int *count){
int *leftarray = (int *)calloc(sizeof(int), mid-start+2);
int *rightarray = (int *)calloc(sizeof(int), end-mid+2);
int i,j = 0,k=0;
for (i = start; i <= mid; i++){
leftarray[j++] = array[i];
}
leftarray[j] = 2147483647;
j = 0;
for (i = mid + 1; i <= end; i++){
rightarray[j++] = array[i];
}
rightarray[j] = 2147483647;
j = 0;
for (i = start; i <= end; i++){
if (leftarray[j] <= rightarray[k]){
array[i] = leftarray[j];
j++;
}
else {
array[i] = rightarray[k];
k++;
if (i != end){
*count += mid + 1 - start - j;
}
}
}
}
static void display(int *array, int size){
for (int i = 0; i<size; i++){
printf("%d ", array[i]);
}
printf("\n");
}
static void mergeSort(int *array, int start, int end, int *count){
if (start >= end){
return;
}
int mid = (start + end) / 2;
mergeSort(array, start, mid, count);
mergeSort(array, mid + 1, end, count);
merge(array, start, mid, end, count);
}
int mergesort() {
int n;
long long int count = 0;
//scanf("%d", &n);
int * array = (int *)calloc(sizeof(int), 100005);
int number = 199999;
for (int i = 0; i < 100000; i++){
array[i] = number--;
}
/*for (int i=0; i<n; i++){
scanf("%d", &array[i]);
}*/
mergeSort(array, 0, 100000 - 1, &count);
/*display(array, n);*/
printf("%d\n", count);
return 0;
}
int main(){
mergesort();
return 0;
}
我正在尝试从geeksforgeeks(https://www.geeksforgeeks.org/counting-inversions/)解决此问题,并实现了以下代码,但对于上述输入值,它给出了错误的结果,即从199999到100000的反向排序数组,而不是得到4999950000的结果,我得到其他一些我尝试调试的结果,但是没有用,谁能告诉我我哪里出错了
答案 0 :(得分:3)
您将计数声明为long long int count = 0;
,然后将其传递给&count
,就好像它只是一个int *
。尝试修复通过&count
传递long long int *
的功能。
我认为您得到的结果是704982704
答案 1 :(得分:0)
我认为您应该使用long int
,因为您使用的值大于int
的大小。