アルゴリズムと計算量 (3): ソート


今日の内容


乱数


単純ソートのアルゴリズムとその評価

[演習 9.1]

  1. 先週の授業で説明した単純ソートの関数 simplesort(a) を作りなさい.
    関数の引数には,各要素に数の入った配列が渡されるものとする.
  2. 配列 a の各要素を乱数で埋めて,関数 simplesort(a) を実行し,配列の要素が小さい順に並び換えられる事を確認しなさい.

[問題 9.1]

  1. 単純ソートでの数の比較回数を値に持つ関数 simplesort_bench(a) を作りなさい.
  2. ソートする配列の長さをいろいろ変えて関数 simplesort_bench(a) の実験を行い,配列の長さ n に対する計算量を実験的に求めなさい.

マージソートのアルゴリズムとその評価

マージのプログラム

def merge(a, b)
  c = Array.new(a.length + b.length)
  ia = 0
  ib = 0
  ic = 0
  while ia < a.length && ib < b.length
    if a[ia] < b[ib]
      c[ic] = a[ia]
      ia = ia + 1
      ic = ic + 1
    else
      c[ic] = b[ib]
      ib = ib + 1
      ic = ic + 1
    end
  end
  while ia < a.length
    c[ic] = a[ia]
    ia = ia + 1
    ic = ic + 1
  end
  c
end

[問題 9.2]

  1. 上記の関数 merge(a, b) をファイル mergesort.rb に保存しなさい.
  2. 関数 merge(a, b) を完成させなさい.

マージソートのプログラム

def mergesort(a)
  n = a.length
  from = Array.new(n)
  for i in 0..n-1
    from[i] = [ (a[i]) ]
  end
  while n > 1
    to = Array.new((n+1)/2)
    for i in 0..n/2-1
      # 配列 from にある2つの列を,配列 to にマージする.
    end
    if n%2 != 0
      to[n/2] = from[n-1]
    end
    from = to
    n = (n+1)/2
  end
  from[0]
end

[問題 9.3]

  1. 上記の関数 mergesort(a) をファイル mergesort.rb に保存しなさい.
  2. 関数 mergesort(a) を完成させなさい.

Ruby の配列

def simplesort(a)
  count = 0
  for i in 0..a.length-2
    for j in i+1..a.length-1
      if a[i] > a[j]
        a[i], a[j] = a[j], a[i]
      end
      count = count + 1    
    end
  end
  [a, count]
end

[問題 9.4]

  1. マージ関数 merge_bench(a,b) の返す値を配列とし,配列の第0要素がマージした結果の配列で,第1要素が要素の比較回数となるようにしなさい.
    例えば,
        c = merge_bench(a,b)
    の場合には,c[0] に配列 a と配列 b をマージした配列,c[1] にマージの際に行われた要素の比較回数が入る.
  2. マージソートの関数 mergesort_bench(a) の返す値を配列とし,配列の第0要素がソートした結果の配列で,第1要素が要素の比較回数となるようにしなさい.
  3. ソートする配列の長さをいろいろ変えて,マージソートの関数 mergesort_bench(a) の実験を行い,配列の長さ n に対する計算量を実験的に求めなさい.

来週の予告


2012年11月17日作成
伊知地 宏
Copyright (C) Hiroshi Ichiji, 2012. All rights reserved.