1. ホーム
  2. スクリプト・コラム
  3. ルビートピックス

挿入ソートアルゴリズムのRuby実装と高度な双方向挿入ソートコード例

2022-01-04 02:44:20

基本事項
ソートされたテーブルに行を挿入し、1つインクリメントされた行を持つ順序付きテーブルを取得します。重要な点は、現在の要素より大きな行をすべて後ろに移動して、"own" の挿入位置を空にすることです。n-1回の挿入が完了すると、レコードは順番に並んだ状態になります。

def insertSort(tarray)
  i=1
  while(i < tarray.size) do
   if tarray[i] < tarray[i-1]
     j=i-1
     x=tarray[i]
   #puts x.class
   #puts tarray[i].class
     tarray[i]=tarray[i-1] # swap positions with the first one on the left that is bigger than yourself first
     while(x< tarray[j].to_i) do#find one smaller than yourself and put it after
      tarray[j+1]=tarray[j]
      #puts tarray[j].class
      j=j-1
     end
     tarray[j+1]=x
   end
   i=i+1
  end
 end

a=[5,2,6,4,7,9,8]
insertSort(a)
print a



[2, 4, 5, 6, 7, 8, 9]>Exit code: 0


x< tarray[j]のところでto_iメソッドを使わないでコードを書き始めたところ、以下のエラーが発生しました。

final.rb:10:in `<': comparison of Fixnum with nil failed (ArgumentError)


最初は混乱したので、x.class, tarray[j].class と出力しましたが、どちらも Fixnum と出力されました。それから、Ruby の Array クラスはちょっと違うことがわかりました。Ruby では Array オブジェクトに異なる型の要素を格納できます。x に a の要素を代入したときに a[i かどうか判断できません。これは私自身の理解ですが、Ruby の Array クラスは、このように出力されます。

高度な
折り返し挿入ソートを基本とした2方向挿入ソート。

def two_way_sort data
 first,final = 0,0
 temp = []
 temp[0] = data[0]
 result = []
 len = data.length

 for i in 1... (len-1)
  if data[i]>=temp[final]
   final += 1
   temp[final] = data[i]
  elsif data[i]<= temp[first]
   first = (first - 1 + len)%len
   temp[first] = data[i]
  else
   if data[i]<temp[0]
    low = first
    high = len -1
   
    while low <=high do
     m = (low + high)>>1
     if data[i]>temp[m]
      low = m + 1
     else
      high = m -1
     end
    end
    
    j = first - 1
    first -=1
    while j < high do
     temp[j] = temp[j+1]
     j += 1
    end
 
    temp[high] = data[i]
   else
    low = 0
    high = final

    while low <=high do
     m = (low + high)>>1

     if data[i]>=temp[m]
      low = m + 1
     else
      high = m - 1
     end
    end

    j = final + 1
    final += 1

    while j > low do
     temp[j] = temp[j-1]
     j -=1
    end 

    temp[low] = data[i]
   end
  end 
  p temp 
 end

 i = 0
 for j in first. (len - 1)
  result[i] = temp[j]
  i += 1
 end

 for j in 0...final
  result[i] = temp[j]
  i +=1
 end

 return result
end


data = [4,1,5,6,7,2,9,3,8].shuffle

p data

result = two_way_sort data

p result