少し話、その後、多くの人々がこの問題に気付かないかもしれない、と今日はちょうど会いました
直接挿入ソートアルゴリズムをソートする必要があり、多くのデータ構造とアルゴリズムで説明したアルゴリズムは、最初に話を予約このです:
2つの段落、1として処理されるべきソート列は、列がいくつかの並べ替え列ではありませんソートされます。(これは、1つずつ比較されるために特に直接挿入ソート)ソートされた列にソートされていないルックアップの最初の列として、その適切な位置を各旅行をソートし、次に挿入されたとき(挿入プロセスはを伴います一連の要素の後に)シフトします。
私はあまり考えて、テキスト記述によってコードに直接書いていません。
DEF InsertSort1(LIST) のための I における:範囲(1、LEN(LIST)) #列要素をソートするために1、0から始まると考え TEMP LIST = [I] #のストア中間変数 のための II における範囲(0、I ): IF LIST [II]> TEMP:背面に#フロントそれが存在する元素よりも大きい場合には逐次に、それは彼がこのビットに落ちるべきであることを示しています。ここでは、同じ数字を確保するために添加されていないが、安定性をソート するための III にレンジ(I、IIは、-1):#1 注その背面から変位要素 LIST [III] LIST = [-III 1 ] LIST [II] = TEMPの BREAKは 返す LISTを
その後、一度に探しているが、三のためどのようにネストされた、非常に適切ではいないようだたので、この期間はの後ろから比較する必要があります思い出されます
DEF InsertSort2(LIST) のための I における範囲(1 、LEN(LIST)): TEMP = LIST [i]が フラグ = 真 のために II における範囲(I-1、-1、-1): #从后往前进行逐次比较 もし LIST [II]> TEMP: LISTの[II +1] = LIST [II] 他: LISTの[II +1] = TEMPの フラグ = Falseの ブレーク であればフラグ: LIST [0] = TEMPの リターン リスト
これは、二つの補助変数、TEMPとフラグを使用しています
実際、多くの書籍は、他の巧妙な方法を、この期間中に書かれていますが、他の記事を見ることができる補助変数、で、私はここに書いてすぐにこのアプローチを本を想起しました。センチネル、必要なフラグは操作の一貫性を維持するために、フラグの使用を必要としない一時使用のような要素のアレイを格納するために使用されていない0要素と呼ばれます。実際には、これは我々が議論する必要が焦点ではありません。
一見すると、2つだけがためにネストされた第二の方法は、良い方法よりもならないのですか?
答えはノーである、実際には、マップの問題は、の良好な発現することができます:
性能InsertSort1()「離れて」、「離れて」、図面において、の逐次非常に安定しており、以前の期間の後続の変位は単に線路長(L)を追加しています
パフォーマンスInsertSort2は()の要素は、リスト上の正しい位置にソートされた列にランクされる図に、その性能は(短い有料「旅」)確かに優れているので、安定していない、とするとき要素の最前列であることを、その性能は、(「歩く」ずっと長く、二倍払うために)悪化しています
実際には、2つのプラクティスは> 2最悪の場合1には、思考の挿入ソート、同じ平均的なパフォーマンス、1よりも優れ2の場合、最高のパフォーマンスと一致しています
私はこの最も独創的なアルゴリズムなど楽しい小さな隠された秘密を期待していなかった正直に言うと、それがやりがいとみなすことができます