簡単に並べ替えアルゴリズムを挿入してPythonプログラムの実現と簡単な改善を行います。


Python挿入順序を実現する一般的な例は以下の通りです。

#coding=cp936
#coding=cp936
#      
def InsertionSort(A):
  for j in range(1,len(A)):
    key = A[j]
    i = j-1
    #        
    while i>=0 and A[i]>key:
      A[i+1] = A[i]
      i = i-1
    A[i+1] = key
 
#       
A = []
input = raw_input('please input some numbers:') #           :7,6,5,1,8,34
for item in input.split(','):
  A.append(int(item))
 
InsertionSort(A)#    
print A
アルゴリズムを挿入する原理は、現在の要素と並べられている部分を比較し、条件を満たすときに挿入し、点を挿入した後の要素は全部後に移動します。
しかし、私もまさにこの説明によって誤解されて、実現する時いくつかの回り道をしました。たとえば、以下のリストがあります。

test = [2, 5, 11, 21, 10, 18, 24]

例えば、現在の元素は10です。最初の実現構想はリストの最初の要素から始まり、元素11を比較してやっと適当な位置を見つけました。最終的には順序付けができます。しかし、問題があります。10を11の位置に挿入した後、11と21を後に移動する必要があります。これはまた別のサイクルが必要です。次のように実現します。

def insertSort(sort_list):
  list_length = len(sort_list)
  if list_length < 2 :
    return sort_list
  for i in range(1,list_length):
    key = sort_list[i]
    j = 0
    while j < i:
      if sort_list[j] > key:
        for k in range(i,j,-1):
          sort_list[k] = sort_list[k-1]
        sort_list[j] = key
        break
      j += 1
  return sort_list
   まず,三つの循環変数と三層サイクルを導入し,効率が低い。次にコード構造が混乱します。改善が必要です。
それから、元素を比較し終わったら、適当な位置に移してもいいですか?スーパーに行って果物を買うなら、手に持ってくるのはよくないです。具体的には、アルゴリズムを実行するには、上のリストでも例を挙げると、現在の要素は10であり、まず隣接する21と比較してみると、21は10より大きいと、21は1ビット後に移動し、すなわち10の位置に移動する。その後10と11を比較して、また11を1つ後ろに移動します。要素5を比較したところ、10の保存すべき位置が見つかりました。このとき移動も完了しました。
コードの実装は以下の通りです。

def insertSort(sort_list):
  list_length = len(sort_list)
  if list_length < 2 :
    return sort_list
  for i in range(1,list_length):
    key = sort_list[i]
    j = i - 1
    while j >=0 and sort_list[j] > key:
      sort_list[j+1] = sort_list[j]
      j -= 1
    sort_list[j+1] = key
  return sort_list

   どちらが優れていますか?どちらが優れていますか?