2012-03-26 5 views
0

整数のリストをソートするソート関数を作成しました。私は出力として取得する必要Pythonのカスタムソート関数の結果が正しくない

def sort(list): 
    s = [] 
    dropnum = 0 
    l = len(list) - 1 
    counter = 0 
    s.append(list[0]) 
    while 1: 
     maximum = len(s) 
     if counter == l: 
      break 
     if list[counter] < s[dropnum]: 
      dropnum = dropnum + 1 
     else: 
      counter = counter + 1 
      if dropnum >= maximum: 
       a.append(list[counter]) 
      else: 
       s.insert(dropnum, list[counter]) 
      dropnum = 0 
    return s 
print sort([70,9,24,82,102]) 

:ここ はコードがある

[102,82,70,24,9] 

しかし、私は得る:

[102, 82, 24, 9, 70] 
+1

'reverse(sorted(list))'を使うのはなぜですか?また、リストと呼ばれる組み込み関数があるので、変数リストの名前を付けてはいけません。これが宿題の場合は宿題としてタグ付けしてください。 – forivall

+0

'sorted()'をなぜ再実装していますか?この宿題ですか? – Amber

+4

さて、 'if dropnum> = maximum:'の後に 's.append'の代わりに' a.append() 'があります。また、 'list'を変数名として使うのは、Pythonの組み込みオブジェクトであるため、一般的には悪い考えです。 – Marius

答えて

1

私はあなたが既に知っている確信しているとして、Pythonの組み込みsorted()ですはるかに効率的なソート方法。

私は、これはあなたがリストを使用すると、ループの通常のPythonを場合は、全くそのカウンタ変数を必要としない

def sort(lst): 
    s = [] 
    for item in lst: 
     dropnum = 0 
     while dropnum < len(s) and s[dropnum] > item: 
      dropnum += 1 
     s.insert(dropnum, item) 
    return s 
print sort([70,9,24,82,102]) 

をやろうとしているものだと思う、これは学習運動と仮定すると

print sorted([70,9,24,82,102], reverse=True) 

for item in lst: # loop through the items in the input 
+0

@agf、かなり正しい、修正済み –

0

あなたのpythonに組み込みが容易オプションのカップルを持っている:

list.sort(...) # in-place, more memory efficient 

と:

にソートするためにどのようなメンバー定義するための

sorted(my_iterable, ...) # returns a new copy 

、必要に応じてブールreverse旗を取るその両方、カスタムcmp比較関数とkey私は、これらの両方が内部でクイックソートの実装のバリエーションを使用すると信じて(大規模なコレクションの場合、小規模のコレクションの場合は単純な反復的なアルゴリズム)。 Pythonバージョン2.3以降では、ソートは安定していることが保証されています。

さらに、現在のスコープ内の名前空間を汚染するため、組み込み関数や型と同じ名前の引数や変数を指定しないでください(例:list)。

関連する問題