![](/img/trans.png)
[英]counting inversions with merge sort gives a negative number if the array length is 100000
[英]Counting Inversions in an array via merge sort
數組的反轉計數指示–數組要排序的距離(或距離)。 如果數組已經排序,則反轉計數為0。如果數組以相反順序排序,則反轉計數為最大。
#include <iostream>
#include <cstdlib>
using namespace std;
int merge(int arr[],int temp[], int left, int mid, int right)
{
int inv_count = 0;
int i = left;
int j = mid;
int k = right;
while((i <= mid-1) && (j <= right))
{
if(arr[i] <= arr[j])
{
temp[k++] = arr[i++];
}
else
{
temp[k++] = arr[j++];
inv_count += (mid - i);
}
}
while(i <= mid-1)
temp[k++] = arr[i++];
while(j <= right)
temp[k++] = arr[j++];
for(i = left; i <= right; i++)
arr[i] = temp[i];
return inv_count;
}
int _merge_sort(int arr[], int temp[], int left, int right)
{
int mid, inv_count = 0;
if(right > left)
{
mid = (right+left)/2;
inv_count = _merge_sort(arr,temp,left,mid);
inv_count += _merge_sort(arr,temp,mid+1,right);
inv_count += merge(arr,temp,left,mid+1,right);
}
return inv_count;
}
int merge_sort(int arr[], int array_size)
{
int *temp = (int *)malloc(sizeof(int)*array_size);
return (_merge_sort(arr,temp,0,array_size-1));
}
int main()
{
int arr[]= {1, 25, 12, 56, 36, 3, 0, 10, 8, 7};
for(int i = 0; i < 10; i++)
cout<<arr[i]<<"\t";
cout<<"\n";
cout<<merge_sort(arr,10)<<"\n";
for(int i = 0; i < 10; i++)
cout<<arr[i]<<"\t";
cout<<"\n";
return 0;
}
給定數組的預期輸出為27,但我得到6。此外,原始數組數據已修改(未排序的值已更改)。
您需要在函數合並中用int k = left替換int k = right。 我認為此數組的預期輸出為27。此處討論了合並排序的各種實現,並在C ++中實現了合並排序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.