shearSort

タグ: ,

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

構文
shearSort( Var array[] )
引数
array
ソートする数値を格納した配列。参照引数。
戻値

プログラム

//////////////////////////////////////////////////
// 【引数】
//   array : ソートする数値を格納した配列。参照引数。 
// 【戻値】
// 
//////////////////////////////////////////////////
PROCEDURE shearSort(Var array[])
	DIM num = UBound(array)
	DIM rows = INT(SQRT(num))
	DIM cols = (num + 1) / rows
	FOR loop = 1 TO rows
		// 行をグループ
		FOR row = 1 TO rows
			IFB row MOD 2 <> 0 THEN
				// 奇数行目
				REPEAT
					DIM flg = FALSE
					FOR col = 1 TO cols - 1
						ofsRow = row - 1
						ofsCol = col - 1
						n = ofsRow * cols + ofsCol
						IFB array[n] > array[n+1] THEN
							swap(array[n], array[n+1])
							flg = TRUE
						ENDIF
					NEXT
				UNTIL !flg
			ELSE
				// 偶数行目
				REPEAT
					flg = FALSE
					FOR col = 1 TO cols - 1
						ofsRow = row - 1
						ofsCol = col - 1
						n = ofsRow * cols + ofsCol
						IFB array[n] < array[n+1] THEN
							swap(array[n], array[n+1])
							flg = TRUE
						ENDIF
					NEXT
				UNTIL !flg
			ENDIF
		NEXT
		PRINT
		// 列をグループ
		FOR col = 1 TO cols
			REPEAT
				flg = FALSE
				FOR row = 1 TO rows - 1
					ofsRow = row - 1
					ofsCol = col - 1
					n = ofsRow * cols + ofsCol
					IFB array[n] > array[n+cols] THEN	
						swap(array[n], array[n+cols])
						flg = TRUE
					ENDIF
				NEXT
			UNTIL !flg
		NEXT
	NEXT
	FOR row = 1 TO rows
		REPEAT
			flg = FALSE
			FOR col = 1 TO cols - 1
				ofsRow = row - 1
				ofsCol = col - 1
				n = ofsRow * cols + ofsCol
				IFB array[n] > array[n+1] THEN
					swap(array[n], array[n+1])
					flg = TRUE
				ENDIF
			NEXT
		UNTIL !flg
	NEXT
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