配列のマージソートを、難しいテクニックを使わないスタンダードな書き方でのサンプル。
function merge_sort( a , start , end ) {
if ( start + 1 == end ) {
// a[start]の1件だけなので並び替える必用なし
} else {
// 真ん中
var mid = Math.floor( (start + end) / 2 ) ;
// 左半分を並べ替え
merge_sort( a , start , mid ) ;
// 右半分を並べ替え
merge_sort( a , mid , end ) ;
// 2つの山をマージする。
var temp = new Array() ; // マージ結果の一時的保存用
var lt = start ; // 左の山の先頭
var rt = mid ; // 右の山の先頭
// ここがまだダサい。
for( i = 0 ; i < end - start ; i++ ) {
var w ;
if ( lt >= mid ) { // 左の山が空、右の山から取り出す
w = a[ rt ] ;
rt++ ;
} else if ( rt >= end ) { // 右の山が空、左の山から取り出す
w = a[ lt ] ;
lt++ ;
} else if ( a[lt] > a[rt] ) { // 左の山から取り出す
w = a[ lt ] ;
lt++ ;
} else { // 右の山から取り出す
w = a[ rt ] ;
rt++ ;
}
temp[ i ] = w ;
}
// マージした結果を、a[]のstart..endに戻す
for( var i = 0 ; i < end - start ; i++ ) {
a[ start + i ] = temp[ i ] ;
console.log( "a["+(start+i)+"]="+a[start+i]) ;
}
}
}
array = new Array( 11 , 45 , 22 , 33 , 77 , 88 , 44 , 55 ) ;
merge_sort( array , 0 , array.length ) ;
for( var i = 0 ; i < array.length ; i++ )
console.log( "a["+i+"]=" + array[i] ) ;