はじめに
本記事ではこちらの本でアルゴリズムの勉強をしているので学んだことをRubyで書いて見ました。初心者なので簡単な記述法しか取れませんがよかったら読んで頂けたらと思います。間違い等あればコメントいただけると幸いです。
アルゴリズムをはじめよう
【本記事で記述するアルゴリズム】
・単純選択法
・単純交換法
・単純挿入法
・クイックソート
単純交換法
一番小さなデータを選択して、先頭から順に並べるアルゴリズムで、主に下記の手順でできています。
①探索範囲の最小値を探す処理
②探索範囲の最小値を先頭要素と交換する処理
defselection_ascending(array)i=0#配列の末尾まで繰り返し処理whilei<array.count-1k=i+1indexmin=i#①探索範囲の最小値を探す処理whilek<array.countifarray[k]<array[indexmin]indexmin=kendk+=1end#②探索範囲の最小値を先頭要素と交換する処理w=array[i]array[i]=array[indexmin]array[indexmin]=wi+=1endarrayend
実行結果
array = Array.new(10)
array.each_index do |i|
array[i] = rand(1000)
end
[835, 95, 359, 273, 102, 387, 932, 79, 434, 248]
election_ascending(array)
[79, 95, 102, 248, 273, 359, 387, 434, 835, 932]
単純交換法(バブルソート)
隣り合ったデータを交換する処理を繰り返して、全体を整列させるアルゴリズム。
①配列の末尾の要素から順に、隣り合ったデータを並べ替える。
②先頭まで並び終えたら末尾に戻り再度並び替えを行う。
defbuble_ascending(array)k=0whilek<array.counti=array.count-1whilek<i#①右端の要素から順に、隣り合ったデータを昇順に並べ替えるifarray[i]<array[i-1]w=array[i]array[i]=array[i-1]array[i-1]=wendi-=1end#左端の要素から一つずつ順番にデータが昇順に整列する。k+=1endarrayend
実行結果
#配列はランダムに作成しています。
array = [914, 433, 369, 664, 640, 352, 680, 970, 830, 108]
buble_ascending(array)
[108, 352, 369, 433, 640, 664, 680, 830, 914, 970]
単純挿入法
単純挿入法では整列済みと未整列の2つの種類にデータを分けて考え、配列の0番目のデータを整列済みとして処理を開始します。挿入用データを格納する変数xとxを格納して空き要素となった配列を表す変数kを用意して処理を行います。
definsertion_ascending(array)i=1whilei<array.countx=array[i]k=iwhilek>0&&array[k-1]>xarray[k]=array[k-1]k-=1endarray[k]=xi+=1endarrayend
実行結果
array = [993, 424, 879, 719, 225, 987, 284, 239, 567, 844]
insertion_ascending(array)
[225, 239, 284, 424, 567, 719, 844, 879, 987, 993]
クイックソート
データの基準となるものを選んで(今回は配列の先頭)データを大小二つのグループに分割しながら全体を整列させてるアルゴリズムです。メゾットの中で同じメゾットを呼び出すことによって大小に分ける処理を繰り返して配列を並び替えます。
defquick_ascending(array,left,right)i=left+1k=rightwhilei<kwhilei<right&&array[i]<array[left]i+=1endwhileleft<k&&array[k]>=array[left]k-=1endifi<kw=array[i]array[i]=array[k]array[k]=wendendifarray[left]>array[k]w=array[left]array[left]=array[k]array[k]=wendifleft<k-1quick_ascending(array,left,k-1)endifk+1<rightquick_ascending(array,k+1,right)endarrayend
実行結果
array = [207, 948, 857, 313, 475, 508, 609, 474, 664, 205]
quick_ascending(target,0,target.count-1)
[205, 207, 313, 474, 475, 508, 609, 664, 857, 948]
以上です。本当に基本的な書き方しかできてませんがここまでお読み頂きありがとうございました。