0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Rubyで整列アルゴリズムを書いてみた。(単純交換法、選択法、挿入法+クイックソート)

Last updated at Posted at 2020-05-09

##はじめに
本記事ではこちらの本でアルゴリズムの勉強をしているので学んだことをRubyで書いて見ました。初心者なので簡単な記述法しか取れませんがよかったら読んで頂けたらと思います。間違い等あればコメントいただけると幸いです。
アルゴリズムをはじめよう

【本記事で記述するアルゴリズム】
・単純選択法
・単純交換法
・単純挿入法
・クイックソート

##単純交換法
一番小さなデータを選択して、先頭から順に並べるアルゴリズムで、主に下記の手順でできています。

①探索範囲の最小値を探す処理
②探索範囲の最小値を先頭要素と交換する処理

def selection_ascending(array)
    i = 0
    #配列の末尾まで繰り返し処理
    while i < array.count-1
        k = i+1
        indexmin = i
        #①探索範囲の最小値を探す処理
        while k < array.count
            if array[k] < array[indexmin]
                indexmin = k
            end
            k += 1
        end
        #②探索範囲の最小値を先頭要素と交換する処理
        w = array[i]
        array[i] = array[indexmin]
        array[indexmin] = w
        i += 1
    end
    array
end
実行結果
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]

##単純交換法(バブルソート)
隣り合ったデータを交換する処理を繰り返して、全体を整列させるアルゴリズム。
①配列の末尾の要素から順に、隣り合ったデータを並べ替える。
②先頭まで並び終えたら末尾に戻り再度並び替えを行う。

def buble_ascending(array)
    
    k = 0

    while k < array.count
        i = array.count-1
        while k < i
            #①右端の要素から順に、隣り合ったデータを昇順に並べ替える
            if array[i] < array[i-1]
                w = array[i]
                array[i] = array[i-1]
                array[i-1] = w
            end
            i -= 1
        end
         #左端の要素から一つずつ順番にデータが昇順に整列する。
         k += 1
    end
    array
end
実行結果
#配列はランダムに作成しています。
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を用意して処理を行います。

def insertion_ascending(array)
    i = 1

    while i < array.count
        x = array[i]
        k = i

        while k > 0 && array[k-1] > x
            array[k] = array[k-1]
            k -= 1
        end

        array[k] = x
        i += 1
    end
    array
end
実行結果
array = [993, 424, 879, 719, 225, 987, 284, 239, 567, 844]
insertion_ascending(array)
[225, 239, 284, 424, 567, 719, 844, 879, 987, 993]

##クイックソート
データの基準となるものを選んで(今回は配列の先頭)データを大小二つのグループに分割しながら全体を整列させてるアルゴリズムです。メゾットの中で同じメゾットを呼び出すことによって大小に分ける処理を繰り返して配列を並び替えます。

def quick_ascending(array,left,right)
    i = left+1
    k = right

    while i < k
        while i < right && array[i] < array[left]
            i += 1 
        end

        while left < k && array[k] >= array[left]
            k -= 1
        end

        if i < k
            w = array[i]
            array[i] = array[k]
            array[k] = w
        end
    end

    if array[left] > array[k]
        w = array[left]
        array[left] = array[k]
        array[k] = w
    end
    
    if  left < k-1
        quick_ascending(array,left,k-1)
    end

    if  k+1 < right
        quick_ascending(array,k+1,right)
    end

    array
end
実行結果
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]

以上です。本当に基本的な書き方しかできてませんがここまでお読み頂きありがとうございました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?