0
私はこの問題をマージソートで解決しようとしましたが、私の解決策には何か問題があります。配列をマージする際に逆数を調べました。 誰かが問題を見つけるのを助けることができますか?与えられた配列内の逆位数を数えよう
void merge(int arr[], int l, int m, int r)
{
int n1=m-l+1;
int n2=r-m;
int left[(n1+1)];
int right[(n2+1)];
for(int i=0;i<n1;i++){
left[i]=arr[l+i];
}
for(int j=0;j<n2;j++){
right[j]=arr[m+j+1];
}
left[n1]=INT_MAX;
right[n2]=INT_MAX;
int i=0, j=0;
//int inv=0;
for(int k=l;k<=r;k++){
if(left[i]<=right[j]){
arr[k]=left[i];
i++;
}
else{
arr[k]=right[j];
j++;
inv+=(m-i);
}
}
//return inv;
}
void mergeSort(int arr[], int l, int r) {
int inv=0;
if (l < r) {
int m = l+(r-l)/2;
mergeSort(arr, l, m);
mergeSort(arr, m+1, r);
merge(arr, l, m, r);
}
// return inv;
}
私はより良い間隔、コメント、変数名を使用して、コードサンプルビットを精製することをお勧めします。 –