アットウィキロゴ
メニュー

モジュール・プラグイン


HSPモジュール・プラグインなど。

htmlプラグインエラー: このプラグインを使うにはこのページの編集権限を「管理者のみ」に設定してください。



配列のソート


HSPだけでなく、プログラム関連全般に言えることだと思いますが、配列のソートって、結構重要になってくると思います。

そこで、配列のソートについて簡単にまとめておきたいと思います。

まず、n個の配列要素があるとします。それぞれはランダムに並んでいると仮定します。ソートするためには、とにかく順番に並べ替えればよいのですが、ほぼ無制限に並べ替えてもCPUの負荷が高くなるだけなので、何回繰り返せばよいのかを計算で出してみたいと思います。

これには法則があるらしく、n個の配列要素がランダムに並んでいる時、ソートを完了させるためには

  (n-1)×(n-1)

回並べ替えればよいことになります。

たとえば、AからEまでのアルファベットがランダムに並べられているとします。

  D C B A E

なぜ(nー1)×(n-1)回かと言うと、仮に5つのアルファベットがソートしたい順番と全く逆に並んでいた場合、5つの要素を片側から2つずつ入れ替えていくと、まず4回入れ替えなければいけません。ただし、2つの要素がソートされていた場合は、並べ替えずに1回分カウントします。それらを4回繰り返すと、必ずソートしたい順番に並びます。

  E D C B A
   ̄  ̄
そのため結果的に、n個の配列要素がランダムに並んでいる時、ソートを完了させるためには(n-1)×(n-1)
回並べ替えればよいことになります。

↓こんな感じでいいと思いますが...、もし間違いがあればどなたか改良お願いします。

; 配列要素をソートするモジュール Ver.1.0 (sort.as)
; このスクリプトはHSP3専用です

#module __sort__

#deffunc sortnum int num_1,int num_2		; 2種類 の要素(int)をソートする

ret=0
if(num_1=num_2){
	ret=0
}else:if(num_1>num_2){
	ret=1
}else:if(num_1<num_2){
	ret=2
}
return ret

#deffunc sortdim array hairetu,int maxmin	; 1次元の配列要素をソートする

leng=length(hairetu)				; ここから 1次元かどうかチェック
leng2=length2(hairetu)
leng3=length3(hairetu)
leng4=length4(hairetu)

if(leng2!0)|(leng3!0)|(leng4!0):return -1
if(maxmin!1)&(maxmin!0):maxmin=0		; ここまで 1次元かどうかチェック

repeat leng-1					; maxmin =0なら 小さい順にソート
srt=0						; maxmin =1なら 大きい順にソート
repeat leng-1
st1=hairetu(srt)
st2=hairetu(srt+1)
taihi=0
if(st1>st2){
	if(maxmin=0){
		taihi=st1
		st1=st2
		st2=taihi
	}
}else:if(st1<st2){
	if(maxmin=1){
		taihi=st1
		st1=st2
		st2=taihi
	}
}
hairetu(srt)=st1
hairetu(srt+1)=st2
srt+=1
loop
loop

return 1

#global

この下に”sort.as”というファイルがあります。

タグ:

+ タグ編集
  • タグ:
最終更新:2006年05月17日 21:03
添付ファイル