| アルゴリズム名 | 計算量 | 安定性 |
|---|---|---|
| バブルソート | O(N^2) | 安定 |
| クイックソート | O(N^2)〜O(N log N) | 不安定 |
| マージソート | O(N log N) | 安定 |
| コームソート | O(N log N) | 不安定 |
| 挿入ソート | O(N^2) | 安定 |
●冨倉メモ
Ruby のソートメソッドは、クイックソートを使っている。
class BubbleSort
def initialize( n )
@target = Array.new(n)
end
def main
puts "準備中"
@target.each_index do |i| # ----- 配列にランダムな値を格納
@target[i] = rand(1000)
end
p @target
puts "並び替え開始"
bubbleSort()
puts "終了"
p @target
end
private
# ----- ソートアルゴリズム
def bubbleSort()
flag = nil
begin
i = 0
flag = false
while i < @target.size - 1
if @target[i] > @target[i + 1]
flag = true
j = @target[i]
@target[i] = @target[i + 1]
@target[i + 1] = j
p @target
end
i = i + 1
end
end while(flag)
end
end
N = 10 # データの件数
bubbleSort = BubbleSort.new(N)
bubbleSort.main
class BubbleSort
def initialize( array )
@target = array
end
def sort
flag = nil
begin
flag = false
(@target.size - 1).times do |i|
if @target[i] > @target[i + 1]
flag = true
j = @target[i]
@target[i] =@target[i + 1]
@target[i + 1] = j
end
end
end while( flag )
end
end
# ---------- Main
if __FILE__ == $0
N = 10
puts "準備中"
array = Array.new( N )
array.each_index do |i|
array[i] = rand( 1000 )
end
p array
s = BubbleSort.new( array )
puts "並び替え開始"
s.sort
puts "終了"
p array
end
class BubbleSort
def initialize( n )
@target = Array.new(n)
end
def main
puts "準備中"
@target.each_index do |i| # ----- 配列にランダムな値を格納
@target[i] = rand(1000)
end
p @target
puts "並び替え開始"
bubbleSort()
puts "終了"
p @target
end
private
# ----- ソートアルゴリズム
def bubbleSort()
flag = nil
begin
i = 0
t = 0
flag = false
while i < @target.size - 1 - t # ----- ここが変更されている
if @target[i] > @target[i + 1]
flag = true
j = @target[i]
@target[i] = @target[i + 1]
@target[i + 1] = j
p @target
end
i = i + 1
end
t = t + 1
end while(flag)
end
end
N = 10 # データの件数
bubbleSort = BubbleSort.new(N)
bubbleSort.main
class BubbleSort
def initialize( array )
@target = array
end
def sort
flag = nil
begin
flag = false
t = 0
(@target.size - 1 - t).times do |i|
if @target[i] > @target[i + 1]
flag = true
j = @target[i]
@target[i] = @target[i + 1]
@target[i + 1] = j
end
end
t += 1
end while( flag )
end
end
if __FILE__ == $0
N = 10
puts "準備中"
array = Array.new( N )
array.each_index do |i|
array[i] = rand( 1000 )
end
p array
s = BubbleSort.new( array )
puts "並び替え開始"
s.sort
puts "終了"
p array
end
●冨倉メモ
Ruby のソートメソッドは、クイックソートを使っている。
class QuickSort
def initialize( n )
@target = Array.new(n)
end
def main
puts "準備中"
@target.each_index do |i|
@target[i] = rand(1000)
end
p @target
puts "並び替え開始"
quickSort(0, N - 1, @target)
puts "終了"
p @target
end
private
# ----- ソートアルゴリズム
def quickSort( bottom, top, data )
lower = bottom
upper = top
return if (bottom >= top)
div = data[bottom]
while lower < upper
while (lower <= upper && data[lower] <= div )
lower += 1
end
while (lower <= upper && data[upper] > div )
upper -= 1
end
if (lower < upper)
temp = data[lower]
data[lower] = data[lower]
data[lower] = data[upper]
data[upper] = temp
end
p data
end
temp = data[bottom]
data[bottom] = data[upper]
data[upper] = temp
quickSort(bottom, upper - 1, data)
quickSort(upper + 1, top,data)
end
end
N = 10
quick = QuickSort.new(N)
quick.main
class QuickSort
def initialize( n )
@target = Array.new(n)
end
def main
puts "準備中"
@target.each_index do |i|
@target[i] = rand(1000)
end
p @target
puts "並び替え開始"
quickSort()
puts "終了"
p @target
end
private
# ----- ソートアルゴリズム
def quickSort()
@target.sort
end
end
N = 10
quick = QuickSort.new(N)
quick.main
class MergeSort
def initialize( n )
@target = Array.new(n)
end
def main
puts "準備中"
@target.each_index do |i|
@target[i] = rand(1000)
end
p @target
puts "並び替え開始"
mergeSort(@target.size, @target, 0)
puts "終了"
p @target
end
private
# ----- ソートアルゴリズム
def mergeSort( n, x, offset )
return if n <= 1
m = n / 2
# ブロックを2分割する
mergeSort(m, x, offset)
mergeSort(n - m, x, offset + m)
# 併合操作
buffer = Array.new(m)
i = 0
while i < m do
buffer[i] = x[offset + i]
i += 1
end
j = m
i = 0
k = 0
while (i < m && j < n) do
if buffer[i] <= x[offset + j]
x[offset + k] = buffer[i]
i += 1
else
x[offset + k] = x[offset + j]
j += 1
end
k += 1
end
while (i < m) do
x[offset + k] = buffer[i]
k += 1
i += 1
end
p x
end
end
N = 10
merge = MergeSort.new(N)
merge.main
バブルソートとは異なり、離れた要素同士を比較して交換していく。徐々に比較する距離を縮めていき、比較する距離が1になった時点でバブルソートと同じになり、完了となる。
class CombSort
def initialize( n )
@target = Array.new(n)
end
def main
puts "準備中"
@target.each_index do |i|
@target[i] = rand(1000)
end
p @target
puts "並び替え開始"
combSort()
puts "終了"
p @target
end
private
# ----- ソートアルゴリズム
def combSort()
flag = nil
gap = @target.size
begin
gap = (gap * 10 ) / 13
gap = 1 if gap == 0
flag = true
i = 0
while i < @target.size - gap do
if @target[i] > @target[i + gap]
flag = false
temp = @target[i]
@target[i] = @target[i + gap]
@target[i + gap] = temp
end
i += 1
end
end while( gap > 1 || !flag)
end
end
N = 10
comb = CombSort.new(N)
comb.main
ほとんど整列が完了しているデータに対して効率がよい。単純挿入ソートでは、リニアサーチを使い、2分挿入ソートでは、バイナリサーチを使う。
class InsertSort
def initialize( n )
@target = Array.new(n)
end
def main
puts "準備中"
@target.each_index do |i|
@target[i] = rand(1000)
end
p @target
puts "並び替え開始"
insertSort()
puts "終了"
p @target
end
private
# ----- ソートアルゴリズム
def insertSort()
sorted = 0
while sorted < @target.size - 1 do
insert = @target[sorted + 1]
i = 0
while i <= sorted do
break if @target[i] > insert
i += 1
end
while i <= sorted + 1 do
temp = @target[i]
@target[i] = insert
insert = temp
i += 1
end
sorted += 1
end
end
end
N = 10
insert = InsertSort.new(N)
insert.main
class InsertSort
def initialize( n )
@target = Array.new(n)
end
def main
puts "準備中"
@target.each_index do |i|
@target[i] = rand(1000)
end
p @target
puts "並び替え開始"
insertSort()
puts "終了"
p @target
end
private
# ----- ソートアルゴリズム
def insertSort()
sorted = 0
while sorted < @target.size - 1 do
insert = @target[sorted + 1]
i = 0
left = 0
right = sorted
while left < right do
mid = (left + right) / 2
if @target[mid] <= insert
left = mid + 1
else
right = mid
end
end
i = left
while i <= sorted + 1 do
temp = @target[i]
@target[i] = insert
insert = temp
i += 1
end
sorted += 1
end
end
end
N = 10
insert = InsertSort.new(N)
insert.main