スクリプト/汎用関数/配列をソートする
最終投稿者: aoihikawa
更新:2017/04/05 22:35:25
配列をソートする
(ご自由にご利用ください)
使用例
参考文献:クイックソート
ご意見やご質問などありましたら
こちらのブログ記事まで。
ツイート
(ご自由にご利用ください)
#配列ソート def pivot(arr,i,j,ord) k = i + 1 while (k <= j) && (arr[i] == arr[k]) do k = k + 1; end if k > j then return -1; end if ord if arr[i] >= arr[k] then return i; end else if arr[i] <= arr[k] then return i; end end return k end def partition(arr,i,j,x,ord) l = i; r = j while l <= r if ord while (l <= j) && (arr[l] < x) do l = l + 1; end while (r >= i) && (arr[r] >= x) do r = r - 1; end else while (l <= j) && (arr[l] > x) do l = l + 1; end while (r >= i) && (arr[r] <= x) do r = r - 1; end end if l <= r t = arr[l]; arr[l] = arr[r]; arr[r] = t l = l + 1; r = r - 1 end end return l end def quickSort(arr,i,j,ord) if i != j p = pivot(arr,i,j,ord) if p != -1 k = partition(arr,i,j,arr[p],ord) arr = quickSort(arr,i,(k - 1),ord) arr = quickSort(arr,k,j,ord) end end return arr end #使用時はこの関数のみ #第1引数:配列 第2引数:昇順 true / 降順 false def sortArray(arr,ord) return quickSort(arr,0,(getArrayLength(arr) - 1),ord) end
使用例
aList = createArray() aList[0] = 3 aList[1] = 1 aList[2] = 4 aList[3] = 6 aList[4] = 2 aList[5] = 8 aList[6] = 7 aList[7] = 5 aList[8] = 9 aList[9] = 3 #配列を降順に並べ替え aList = sortArray(aList, false) speak(aList) #9,8,7,6,5,4,3,3,2,1 bList = createArray() bList[0] = "すみれ" bList[1] = "ひまわり" bList[2] = "あかね" bList[3] = "なずな" bList[4] = "あおい" bList[5] = "われもこう" bList[6] = "ききょう" bList[7] = "れんげ" bList[8] = "すずらん" bList[9] = "あんず" #配列を昇順に並べ替え bList = sortArray(bList, true) speak(bList) #あおい,あかね,あんず,ききょう,すずらん,すみれ,なずな,ひまわり,れんげ,われもこう
参考文献:クイックソート
ご意見やご質問などありましたら
こちらのブログ記事まで。
コメントする
コメントするには、ログインする必要があります。
配列を二次元配列aにして、a[i][0]に数値を入れて並び替えるような時、
数値の桁が違うと数値が順番にならないようです
このように、一次元配列でない時、文字列的な比較での並び替えになるようです
配列a[i][0]にスコア、a[i][1]にプレイヤー名などを入れて、
a[i][0]のスコアを並び替えてランキングを作る・・・みたいなことをしたかったので、
100以下の数値の時に、数値の前に" "を足して使ってます。
しかし、原因がよくわからないため、報告しました。
今回の例でいくと、
「88,0」「89,1」「109,2」「60,3」「960,4」という『,』を含んだ値=文字列のソート判定となり、
想定された動作にならないことを確認いたしました
きれいな関数なので自分では理由がわかりませんでした。
理由がわかったことでより使いやすくなりました。
多次元配列用のソート関数を用意しました
こちらをご利用頂けましたら幸いです
<サンプル>