シェアソート
- 構文
- 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
この記事は役に立ちましたか?