次のコードは、配列内の逆位の数スタックエラー、RangeError:基本ケースが定義されている場合でも、最大呼び出しスタックサイズを超えてしまうまで、常に再帰的にサブ問題に分割されます。ここで問題になる可能性のあるものmergesortを使用した反転のカウント - javacript
function mergeSort(arr) {
var n = arr.length;
var l=0,h=n-1;
if (l<h) {
var m=findMid(l,h);
var leftArr=arr.slice(l,m);
var rightArr=arr.slice(m,n);
var invCount = mergeSort(leftArr)+mergeSort(rightArr);
invCount += merge(leftArr,rightArr,n);
}
return invCount;
}
function merge(a, b,n) {
var i=0,j=0,m=[];
var splitInv=0;
for(var k=0;k<n;k++) {
if(a[i]<b[j]) m[k]=a[i++];
else if (b[j]<a[i]){
m[k]=b[j++];
splitInv+=n-i;
}
}
return splitInv;
}
function findMid(l, r) {
var m = Math.floor((l + r)/2);
return m;
}
私は別の方法でベースケースを処理するために上記のコードを変更しました。以下のロジックが正しいです:
function mergeSort(arr) {
var n = arr.length;
var l=0,h=n-1;
var invCount=0;
if(n<=2) {
return merge(arr[0],arr[1],n);
}else{
var m=Math.floor(n/2);
var leftArr=arr.slice(l,m);
var rightArr=arr.slice(m);
invCount += mergeSort(leftArr)+mergeSort(rightArr);
}
return invCount;
}
function merge(a, b,n) {
var i=0,j=0,m=[];
var splitInv=0;
if(typeof b=="undefined") {
return 0;
}
for(var k=0;k<n;k++) {
if(a[i]<b[j]) m[k]=a[i++];
else if (b[j]<a[i]){
m[k]=b[j++];
splitInv+=n-i;
}
}
return splitInv;
}
あなたの 'merge()'関数は** 3 **パラメータを取るように書かれていますが、** 2 **を渡すだけです。 – Pointy
これは修正されましたが、それでも問題が存在します –
まだ問題はありますか? – trincot