mergeSort

タグ: ,

引数に指定された配列をマージソートで並び替えます。

マージソートは整列されていないリストを2つのリストに分割して、それぞれを整列させた後、それらをマージして整列済みのひとつのリストを作ります。

構文
mergeSort( Var array[], [Lt = 0, Rt = 0] )
引数
array
ソートする数値を格納した配列。参照引数。
Lt
Rt
戻値

プログラム

//////////////////////////////////////////////////
// 【引数】
//   array : ソートする数値を格納した配列。参照引数。 
//   Lt 
//   Rt 
// 【戻値】
//   
//////////////////////////////////////////////////
PROCEDURE mergeSort(Var array[], Lt = 0, Rt = 0)
	IF Rt = 0 THEN Rt = UBound(array)
	IFB Rt - Lt <= 1 THEN
		IFB array[Lt] >= array[Rt] THEN
			swap(array[Lt], array[Rt])
		ENDIF
		EXIT
	ENDIF
	DIM mid = INT((Lt + Rt) / 2)
	mergeSort(array, Lt, mid)
	mergeSort(array, mid + 1, Rt)
	merge(array, Lt, mid + 1, Rt)
FEND

PROCEDURE merge(Var array[], Lt, mid, Rt)
	DIM tmp1 = SLICE(array, Lt, mid - 1)
	DIM tmp2 = SLICE(array, mid, Rt)
	DIM tmp[-1]
	WHILE tmp1[0] <> EMPTY OR tmp2[0] <> EMPTY
		IFB (tmp1[0] < tmp2[0] AND tmp1[0] <> EMPTY) OR tmp2[0] = EMPTY THEN
			arrayPush(tmp, tmp1[0])
			SHIFTARRAY(tmp1, -1)
		ELSE
			arrayPush(tmp, tmp2[0])
			SHIFTARRAY(tmp2, -1)
		ENDIF
	WEND
	FOR n = Lt TO Rt
		array[n] = tmp[n-Lt]
	NEXT
FEND

//////////////////////////////////////////////////
// 【引数】
//   array : 要素を追加する配列(参照引数) 
//   str : 追加する要素 
// 【戻値】
//   処理後の配列の中の要素の数 
//////////////////////////////////////////////////
FUNCTION arrayPush(var arr[], str)
	DIM res = RESIZE(arr, UBound(arr) + 1)
	arr[res] = str
	RESULT = res + 1
FEND

//////////////////////////////////////////////////
// 【引数】
//   a : 変数bと交換する値。参照引数。 
//   b : 変数aと交換する値。参照引数。 
// 【戻値】
//   
//////////////////////////////////////////////////
PROCEDURE swap(Var a, Var b)
	DIM tmp = a
	a = b
	b = tmp
FEND

//////////////////////////////////////////////////
// 【引数】
//   配列 : 上限値を求める配列 
// 【戻値】
//   配列の上限値 
//////////////////////////////////////////////////
FUNCTION UBound(array[])
	RESULT = RESIZE(array)
FEND

マージソート

アルゴリズム

  1. データ列を2分割する。
  2. 分割された各データ列で、含まれるデータが1個ならそれを返し、2個以上ならステップ1から3を再帰的に適用してマージソートする
  3. 2つのソートされたデータ列(1個であればそれ自身)をマージする
最悪計算時間 \(O(n \log n)\)
最良計算時間 \(O(n \log n)\)
\(O(n)\)
平均計算時間 \(O(n \log n)\)

Was this post helpful?

関連記事

heapSort
引数に指定された配列をヒープソートで並び替えます。
quickSort
問題を小さな部分問題に分割していく分割統治法を利用した手法で、データから適当に基準値を決めこれより大きいグループと小さいグループに分けるという手順を、分けた小さなグループに対しても再帰的に繰り返していきます。
oddEvenSort
奇偶転置ソートは、ソートのアルゴリズムの一つで、バブルソートを改良したもの。バブルソートではスキャンを一方向に順次行うのに対し、奇偶転置ソートでは組ごとに行います。
shearSort
シェアソートはソートアルゴリズムの一つで、データを長方形に並べた上で各行・各列ごとにソートを行ないます。
bogoSort
要素をランダムに並べ替えることで偶発的な一致を試みる整列アルゴリズムです。
QSORT
QSORT関数は、配列の中身をソートする関数です。戻値はありません。昇順・降順・UNICODE文字比較 昇順・UNICODE文字比較 降順・自然順ソート 昇順・自然順ソート 降順のいずれかを指定することができます。
bubbleSort
引数に指定した配列をバブルソートで並び替えます。
shakerSort
シェーカーソートは、ソートのアルゴリズムの一つです。バブルソートを改良したもの。双方向バブルソート、改良交換法とも言われます。バブルソートではスキャンを一方向にしか行わないのに対し、シェーカーソートでは交互に二方向に行います。
combSort
コムソートではソートの初期段階では離れた要素を比較交換します。そして徐々に2つの要素間の距離を縮めて、最後に直接隣接している要素どうしの比較交換を行います。
gnomeSort
ノームソートはソートアルゴリズムの一つです。挿入ソートに似ているが、要素の移動は挿入ではなくバブルソートのような一連の交換で行います。
selectionSort
選択ソートは、ソートのアルゴリズムの一つ。配列された要素から、最大値やまたは最小値を探索し配列最後の要素と入れ替えを行うことでソートします。
insertionSort
挿入ソートは、ソートのアルゴリズムの一つ。整列してある配列に追加要素を適切な場所に挿入します。
shellSort
シェルソートは挿入ソートが改良された整列アルゴリズムです。リストにおいてあらかじめ離れている要素を交換しておき、最終的に挿入ソートを実行します。
arraySearch
配列の中から指定した要素が見つかった場合、その要素がある最初のインデックスを返します。
arrayReverse
引数に指定した配列を逆順にして返します。
FOR-IN-NEXT
配列やコレクションなどのグループの各要素に対して繰り返し処理を行います。
CALCARRAY
配列の合計値・最小値・最大値・平均値を求めます。
UBound
配列の最大インデックスを返します。
GETALLWIN
全ウィンドウのIDを取得します。
divisors
引数に指定した数値の約数をリストを配列で返します。
JOIN
引数に指定した配列を結合し文字列を返します。
Sort
POPUPMENU
ポップアップメニューを表示し、引数に指定した配列の中から選択された項目の要素番号を取得します。選択された項目を取得したい場合は、POPUPMENUの戻値を引数に指定した配列の要素番号として指定します。
RESIZE
配列のサイズを変更します。第二引数を省略した場合はサイズを取得します。
連想配列
連想配列とは、自動的に割り当てられる数字をキーとして持つかわりに、自由に任意の文字列を割り振ることができる配列のことです。添え字に番号の変わりに名前をつけることでわかりやすく管理することができます。
SETCLEAR
配列のすべての要素を任意の値で埋めます。
SHIFTARRAY
配列を指定した値だけシフトします。プラス値で後方、マイナス値で前方にシフトします。
SLICE
SLICE関数は、配列の中を指定範囲の配列で返す関数です。第一引数に配列を指定し、第二引数に開始位置、第三引数に終了位置を指定します。第二・第三引数は省略可能で、省略した場合は配列全体を返します。戻値はsafearray型です。
SPLIT
SPLIT関数は、引数に指定された文字列を区切文字列で区切り配列に格納します。区切文字列を省略した場合、スペースが区切文字列となります。戻値は配列でsafearray型です。
inArray