Objective-C でのマージソートの実装に取り組んでいます (以下のコード)。変数 ' ' を 1 つインクリメントしないと、再帰呼び出しが無限ループになる理由を理解するのに苦労していますmiddle
。
そう [self sort:array fromLow:middle+1 toHigh:high]
; 正常に動作します
しかし[self sort:array fromLow:middle toHigh:high];
、私のプログラムを無限ループに変えます。なぜそれが起こっているのか誰にも説明できますか?どちらの場合も if ステートメント
if(high<=low)
{
return;
}
到達して実行されるので、プログラムは 3 番目のステートメント (mergeLow: andHigh: andMiddle: inArray: andHelperArray:) に移動すると思いますが、そうではありません。
並べ替え方法:
-(void)sort:(NSMutableArray *)array fromLow:(unsigned long)low toHigh:(unsigned long) high{
if(high<=low) //recursive condition fullfilled
{
return;
}
unsigned long middle = low + (high - low)/2; //calculating middle element
[self sort:array fromLow:low toHigh:middle]; //(1)sort left
[self sort:array fromLow:middle+1 toHigh:high];//(2)sort right
[self mergeLow:low andHigh:high andMiddle:middle inArray:array andHelperArray:[array mutableCopy]];//(3) merge left and right
}
デバッグ デバッグ してみました。これを行うために、呼び出し (3) をマージ メソッドにコメント アウトし、nslog ステートメントで高変数と低変数の値をログに記録するように追加しました。
MergeSort *is = [MergeSort new];
NSArray * a1 = @[@10,@9,@22,@5];
[is sort:a1.mutableCopy fromLow:0 toHigh:a1.count];
ソート方法の更新
-(void)sort:(NSMutableArray *)array fromLow:(unsigned long)low toHigh:(unsigned long) high{
//recursive condition fullfilled
NSLog(@"High: %lu Low %lu ",high, low);
if(high<=low)
{
return;
}
unsigned long middle = low + (high - low)/2;
[self sort:array fromLow:low toHigh:middle];
[self sort:array fromLow:middle + 1 toHigh:high];
// [self mergeLow:low andHigh:high andMiddle:middle inArray:array andHelperArray:[array mutableCopy]];
}
デバッグ出力: middle+1
2013-10-28 11:37:21.484 Algorithms[52598:303] High: 4 Low 0
2013-10-28 11:37:21.486 Algorithms[52598:303] High: 2 Low 0
2013-10-28 11:37:21.486 Algorithms[52598:303] High: 1 Low 0
2013-10-28 11:37:21.487 Algorithms[52598:303] High: 0 Low 0
2013-10-28 11:37:21.487 Algorithms[52598:303] High: 1 Low 1
2013-10-28 11:37:21.488 Algorithms[52598:303] High: 2 Low 2
2013-10-28 11:37:21.488 Algorithms[52598:303] High: 4 Low 3
2013-10-28 11:37:21.488 Algorithms[52598:303] High: 3 Low 3
2013-10-28 11:37:21.489 Algorithms[52598:303] High: 4 Low 4
同じメソッドで[self sort:array fromLow:middle toHigh:high];
、変数をインクリメントせずに を実行しmiddle
、次の出力を取得しています。
デバッグ出力: 中
2013-10-28 11:45:55.689 Algorithms[52674:303] High: 4 Low 0
2013-10-28 11:45:55.691 Algorithms[52674:303] High: 2 Low 0
2013-10-28 11:45:55.691 Algorithms[52674:303] High: 1 Low 0
2013-10-28 11:45:55.692 Algorithms[52674:303] High: 0 Low 0
2013-10-28 11:45:55.692 Algorithms[52674:303] High: 1 Low 0
2013-10-28 11:45:55.693 Algorithms[52674:303] High: 0 Low 0
2013-10-28 11:45:55.693 Algorithms[52674:303] High: 1 Low 0
2013-10-28 11:45:55.693 Algorithms[52674:303] High: 0 Low 0
2013-10-28 11:45:55.694 Algorithms[52674:303] High: 1 Low 0
2013-10-28 11:45:55.694 Algorithms[52674:303] High: 0 Low 0
2013-10-28 11:45:55.694 Algorithms[52674:303] High: 1 Low 0
2013-10-28 11:45:55.695 Algorithms[52674:303] High: 0 Low 0
2013-10-28 11:45:55.695 Algorithms[52674:303] High: 1 Low 0
2013-10-28 11:45:55.696 Algorithms[52674:303] High: 0 Low 0
2013-10-28 11:45:55.696 Algorithms[52674:303] High: 1 Low 0
2013-10-28 11:45:55.696 Algorithms[52674:303] High: 0 Low 0
2013-10-28 11:45:55.697 Algorithms[52674:303] High: 1 Low 0
2013-10-28 11:45:55.697 Algorithms[52674:303] High: 0 Low 0
2013-10-28 11:45:55.698 Algorithms[52674:303] High: 1 Low 0
2013-10-28 11:45:55.698 Algorithms[52674:303] High: 0 Low 0
2013-10-28 11:45:55.699 Algorithms[52674:303] High: 1 Low 0
2013-10-28 11:45:55.699 Algorithms[52674:303] High: 0 Low 0
2013-10-28 11:45:55.699 Algorithms[52674:303] High: 1 Low 0
2013-10-28 11:45:55.700 Algorithms[52674:303] High: 0 Low 0
2013-10-28 11:45:55.700 Algorithms[52674:303] High: 1 Low 0
2013-10-28 11:45:55.700 Algorithms[52674:303] High: 0 Low 0
2013-10-28 11:45:55.701 Algorithms[52674:303] High: 1 Low 0
2013-10-28 11:45:55.701 Algorithms[52674:303] High: 0 Low 0
2013-10-28 11:45:55.702 Algorithms[52674:303] High: 1 Low 0
2013-10-28 11:45:55.702 Algorithms[52674:303] High: 0 Low 0
2013-10-28 11:45:55.702 Algorithms[52674:303] High: 1 Low 0