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.

【python】ソートプログラムを自分で作ってみる。(選択ソート、挿入ソート、バブルソート)

Last updated at Posted at 2020-10-14

#【python】ソートプログラムを自分で作ってみる。(選択ソート、挿入ソート、バブルソート)

  1. 選択ソート
  2. 挿入ソート
  3. バブルソート

##選択ソート

最少値を見つけて先頭の要素と交換する。

実際の処理としては、複数の考え方を合わせる必要がある。
(1) 最少値を求める
(2) 最少値を先頭の値と入れ替える
(3) (1)と(2)を先頭が確定していない値の中で繰り返す


選択ソート
def min_init(arr, x):
  min = x
  for i in range(x, len(arr)):
    if arr[min] > arr[i]:
      arr[i], arr[min] = arr[min], arr[i]

def min_sort(arr):
  for j in range(0, len(arr)-1):
    min_init(arr, j)
  print(arr)
実行例
a = [2,4,5,3,10,1,8,6]
min_sort(a)

#[1, 2, 3, 4, 5, 6, 8, 10]

###考え方
####(1) 最少値を求める
まずは最少値を求める式を考える。
minの初期値を0番目として、次の数値と比較する。
次の数値が小さい場合に、minを入れ替える

#最少値を求める
def min_val(arr):
  min = 0
  for i in range(1, len(arr)):
    if arr[min] > arr[i]:
      min = i
  print(a[min])


#確認
a = [2,4,5,3,10,1,8,6,3,2]
min_val(a)

#1

####(2) 最少値を先頭の値と入れ替える
上記の最少値を求めるプログラムを応用して、最少値が見つかったタイミングで、その値と先頭の値を交換する。

最終的に、最少値が先頭にきた配列を求める。

#最少値を見つけて配列の先頭に移動する
def min_first(arr):
  min = 0
  for i in range(1, len(arr)):
    if arr[min] > arr[i]:
      arr[i], arr[min] = arr[min], arr[i]
  print(a)


#確認
a = [2,4,5,3,10,1,8,6]
min_first(a)

#[1, 4, 5, 3, 10, 2, 8, 6]

####(3) (1)と(2)を先頭が確定していない値の中で繰り返す
上記を応用して処理を繰り返す。
注意点は、minの初期値を変数にする。こうすることで比較対象範囲がひとつづつ後ろにずれていく。

定数にしてしまうと、常に同じ値と比較することになり狙った出力にならない。

def min_init(arr, x):
  min = x
  for i in range(x, len(arr)):
    if arr[min] > arr[i]:
      arr[i], arr[min] = arr[min], arr[i]

def min_sort(arr):
  for j in range(0, len(arr)-1):
    min_init(arr, j)
  print(arr)

#確認
a = [2,4,5,3,10,1,8,6]
min_sort(a)

#[1, 2, 3, 4, 5, 6, 8, 10]

##挿入ソート 先頭をソート済みとして、次の数値をどこに追加していくかを判断していく方法。

・未ソートの先頭の値とその前の値を比較
・未ソートの方が小さければ、未ソートがあった値を大きい値で上書きする。(未ソートの値は変数で保管しておく)
・未ソートの方が大きくなったところで確定する

def insert_sort(arr):
  for i in range(1,len(arr)):
    tmp = arr[i]  #未ソートの先頭
    j = i -1   #ソート済みの一番後ろ(未ソートの一個前)
    
    #要素を比較して、tmpの方が小さければj+1の値を置き換えていく
    while arr[j] > tmp and j >= 0:
      arr[j+1] = arr[j]
      j -= 1

    #tmpの方が大きいなら、j+1をtmpで確定する
    arr[j+1] = tmp
確認
a = [2,4,5,3,10,1,8,6]
insert_sort(a)
print(a)

#[1, 2, 3, 4, 5, 6, 8, 10]

###tmpとは
変数。値が順次追加されたり、削除されたりしていく一時的な変数を明示するために使う。temporaryの略。


##バブルソート 後ろから、隣合う要素を比較して交換していく。

一番先頭の2つを比較し終わった時点で、先頭が確定する。
残りの要素で同じ操作を繰り返す。

処理の流れとしては、
(1) 最後の値を隣り合う値と比較して、より小さければ交換する。
(2) (1)の作業を繰り返す。先頭は1回づつ固定していく。

def bubble_sort(arrs):
  for j in range(0, len(arrs)):
    exchange(arrs, j)

def exchange(arr, j):
  for i in range(len(arr)-1, j, -1):
    if arr[i-1] > arr[i]:
      arr[i-1], arr[i] = arr[i], arr[i-1]
#確認
a = [2,4,5,3,10,1,8,6]
bubble_sort(a)
print(a)

#[1, 2, 3, 4, 5, 6, 8, 10]

▼(参考)隣り合う値を比較し交換する

#小さい数値を前方に移動する
def exchange(arr):
  for i in range(len(arr)-1, 0, -1):
    if arr[i-1] > arr[i]:
      arr[i-1], arr[i] = arr[i], arr[i-1]
  print(arr)


#確認
a=[8,2,6,1]
exchange(a)

#[1, 8, 2, 6]
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?