2010-12-03 54 views
0

次の質問には再帰的選択ソートがあります。再帰的選択ソートpython

def selsort(l): 
    """ 
    sorts l in-place. 
    PRE: l is a list. 
    POST: l is a sorted list with the same elements; no return value. 
    """      

l1 = list("sloppy joe's hamburger place") 
vl1 = l1 

print l1 # should be: """['s', 'l', 'o', 'p', 'p', 'y', ' ', 'j', 'o', 'e', "'", 's', ' ', 'h', 'a', 'm', 'b', 'u', 'r', 'g', 'e', 'r', ' ', 'p', 'l', 'a', 'c', 'e']""" 

ret = selsort(l1) 

print l1 # should be """[' ', ' ', ' ', "'", 'a', 'a', 'b', 'c', 'e', 'e', 'e', 'g', 'h', 'j', 'l', 'l', 'm', 'o', 'o', 'p', 'p', 'p', 'r', 'r', 's', 's', 'u', 'y']""" 
print vl1 # should be """[' ', ' ', ' ', "'", 'a', 'a', 'b', 'c', 'e', 'e', 'e', 'g', 'h', 'j', 'l', 'l', 'm', 'o', 'o', 'p', 'p', 'p', 'r', 'r', 's', 's', 'u', 'y']""" 

print ret # should be "None" 

私はキー→ l.sort(key=str.lower)を使用してこれを取得する方法を知っています。しかし、質問では、最小値ではなく最大要素を抽出して、再帰的にソートされたサブリストに.append(...)までしか渡さないようにしたいと考えています。

私は何か助けを得ることができたら、私はそれを高く評価します。

+0

行をコードとしてフォーマットするには、4つのスペースをインデントすることができます。エディタツールバーの "101 \ n010"ボタンがこれを行います。質問の下にある編集リンクを使用して質問を編集し、サンプルコードをフォーマットすることができます。書式設定の詳細とヒントについては、エディタツールバーのオレンジ色の疑問符をクリックしてください。 – outis

+2

組み込みの 'list.sort()'メソッドを使用することはできません。 –

+0

「最小要素ではなく最大要素を抽出する」とはどういう意味ですか?逆のリスト? – Kabie

答えて

0

ソート方法は、必要な処理を行う必要があります。逆の場合は、list.reverse()を使用してください。

あなたの仕事が独自のソート方法を作ることであれば、それを行うことができます。

たぶん、このような何かを試してみてください。

def sort(l): 
    li=l[:]          #to make new copy 
    newlist = []         #sorted list will be stored here 
    while len(li) != 0:       #while there is stuff to be sorted 
     bestindex = -1        #the index of the highest element 
     bestchar = -1        #the ord value of the highest character 
     bestcharrep = -1       #a string representation of the best character 
     i = 0 
     for v in li: 
      if ord(v) < bestchar or bestchar == -1:#check if string is lower than old best 
       bestindex = i      #Update best records 
       bestchar = ord(v) 
       bestcharrep = v 
      i += 1 
     del li[bestindex]       #delete retrieved element from list 
     newlist.append(bestcharrep)    #add element to new list 
    return newlist         #return the sorted list 
2

Soがあなたはその問題を理解していますか?

のは、あなたがするように求めていたものを見てみましょう:

が再帰的にソートされたサブリストにのみ(...).appendし、代わりに最小の、それを最大の要素を上取り出します。

だから、我々は次のことを行う:

1)が最大の要素を抽出します。ここで「抽出」とは何かを理解していますか?あなたは最大の要素を見つける方法を知っていますか?

2)サブリストを再帰的にソートします。ここで、「サブリスト」は、最大要素を抽出した後のすべての要素から構成されます。再帰の仕組みを知っていますか?サブリストを使って並べ替え機能を呼び出すだけで、並べ替えを行うことができます。結局のところ、あなたの関数の目的はリストをソートすることなので、これはうまくいくはずです。 :)

3).append()サブリストをソートした結果の最大要素。これは説明を必要とすべきではありません。

もちろん、再帰のための基本ケースが必要です。いつベースケースがありますか?私たちが正確に書かれた通りの手順に従うことができないとき。それはいつですか?まあ、なぜそれが起こるでしょうか?答え:要素がなければ最大要素を抽出できません。抽出する最大要素がないからです。

したがって、関数の先頭で、空のリストが渡されたかどうかを確認します。空のリストをソートすると空のリストになるので、空のリストを返すだけです。 (理由は分かりますか?)そうでない場合は、他の手順を実行します。