3k さん
ユーザー定義の比較を使うとすると下のようになるんですが
これは許容範囲だと思いますか?
※便宜上コムソートにしています
// ソートライブラリ ここから
#module comb_sort_mod
#define global comb_sort_a s_cmp_a@comb_sort_mod
#define global comb_sort_b s_cmp_b@comb_sort_mod
#define global comb_sort(%1,%2,%3=0) s_var@comb_sort_mod=%3 : comb_sort_ %1,%2,s_var@comb_sort_mod
#deffunc comb_sort_ array data, int data_num, var usercmp, \
local h, local is_changed, local cmp, local temp
cmp=usercmp
if vartype(cmp)!1 {
if vartype(data)=vartype("str") {
cmp=*cmp_str_default
} else {
cmp=*cmp_num_default
}
}
h=data_num*10/13
repeat
is_changed=0
repeat data_num-h
dup s_cmp_a, data(cnt)
dup s_cmp_b, data(cnt+h)
gosub cmp
if stat>0 {
temp=data(cnt)
data(cnt)=data(cnt+h)
data(cnt+h)=temp
is_changed=1
}
loop
if h>1 {
h=h*10/13
} else {
if is_changed=0 : break
}
loop
return
// デフォルトの比較関数
*cmp_num_default
return comb_sort_a>comb_sort_b
*cmp_str_default
dim a
dim b
repeat
a=peek(comb_sort_a, cnt)
b=peek(comb_sort_b, cnt)
if a=0 or a!b : break
loop
return a>b
#global
// ソートライブラリ ここまで
/*============================================================
============================================================*/
// 整数のソート
dim data
data=6,3,9,7,2,1,8,4,5
disp data
comb_sort data, length(data)
disp data
comb_sort data, length(data), *cmp_num_descend
disp data
// 文字列のソート
dim data
data="banana", "grape", "apple", "meron", "strawberry"
disp data
comb_sort data, length(data)
disp data
comb_sort data, length(data), *cmp_str_descend
disp data
stop // 終了!
// 数値用ユーザー定義比較関数?
*cmp_num_descend
return comb_sort_a<comb_sort_b
// 文字列用ユーザー定義比較関数?
*cmp_str_descend
repeat
a=peek(comb_sort_a, cnt)
b=peek(comb_sort_b, cnt)
if a=0 or a!b : break
loop
return a<b
#module
// データ表示
#deffunc disp array data, int data_num_, local data_num, local buf
data_num=data_num_
if data_num<=0 : data_num=length(data)
repeat data_num
if cnt=0 {
buf=str(data(cnt))
} else {
buf+=", "+str(data(cnt))
}
loop
mes buf
return
#global