ソートコントラストのすべての種類
最悪と最高の安定性の複雑希望複雑さの複雑さをソートする方法
冒泡排序 稳定 O(n)O(n)O(n) O(n2)O(n^2)O(n2) O(n2)O(n^2)O(n2)
选择排序 稳定 O(n2)O(n^2)O(n2) O(n2)O(n^2)O(n2) O(n2)O(n^2)O(n2)
插入排序 稳定 O(n)O(n)O(n) O(n2)O(n^2)O(n2) O(n2)O(n^2)O(n2)
クイック不安定O(N)O(N)O(N)O(N 2)O(N ^ 2)O(N 2)O(nlogn)O(nlogn)O(nlogn)
ソート安定マージO(nlogn)O(nlogn)O(nlogn)O(nlogn)O(nlogn)O(nlogn)O(nlogn)O(nlogn)O(nlogn)
バブルソート
核となるアイデアは、隣接する要素、スワップ場所のサイズを比較することです。
具体的な手順は、外側ループおよび内側ループに分けることができます。
アウターループ配列(昇順の場合)の端部に配列「シンク」で最大の要素の各ステップと
サイクルの各ステップ隣接スワップのサイズの要素の位置。
元の配列:[1,2,9,9,4,5,6,6,3,9,4]
サイクルの最初のステップ:要素1と要素2を比較すると、無交換位置(ASC)。
内側ループステップ:素子2と9を比較する要素、無交換位置と、
第3の内部ループのステップ:比較要素9と素子9は、位置を交換しません。
循環工程4:エレメント4と同等の9つの要素、交換位置[1,2,9,4,9,5,6,6,3,9,4]。
循環工程5:エレメント5と同等9つの素子、スイッチング位置[1,2,9,4,5,9,6,6,3,9,4]。
第6工程を循環:エレメント6と素子9を比較すると、交換位置[1,2,9,4,5,6,9,6,3,9,4]。
...
サイクルの最後のステップ:要素6と同等の9つの要素、交換位置[1,2,9,4,5,6,6,3,9,4,9]であり;
最初のステップは、アウターループサイクルが[1,2,9,4,5,6,6,3,9,4,9]のために、素子9の端部に沈むで生じます。
【1,2,4,5,6,6,3,9,4,9,9]として、端部に第二素子9シンク;外側のループをステップ
【1,2,4,5,6,3,6,4,9,9,9]として、端部に第三元素9シンク;外側のループをステップ
アウターループ第四工程:最後に第三元素9シンク、[1,2,4,5,3,6,4,6,9,9,9]として;
...
外側のループの最後のステップ:最終結果[1,2,3,4,4,5,6,6,9,9,9]。
アルゴリズム
バブルソートは安定ソートです。
最適状況下で、アレイは、時間複雑度はO(n)O(N)O(N)の程度陽性です。
最悪の場合の逆は、時間計算量はO(N 2)O(N ^ 2)O(N 2)。
デフバブルソート(NUMS):
lenの場合(NUMS)<2:
リターンNUMS
なぜなら、インデックスの後ろに#1は、比較対象に追加するので、ここでlenされる(NUMS) - 1
範囲内のiについて(LEN(NUMS)-1):
#-Iは私の要素が最後に沈むすでにあります
範囲内のJ(LEN(NUMS)-i-1)のための:
NUMS [J]> NUMS [J + 1]の場合:
NUMS [J]、NUMS [J + 1] = NUMS [J + 1]、NUMS [J]
リターンNUMS
選択ソート
核となるアイデアは、(端部で)最初に取り出された残りの要素(最大)の要素の最小です。
具体的な手順:
n個の要素、最小の要素を見つけるための最初の場所を横断します。
残りのn-1個の要素、最小の要素を見つけるための最初の場所を横断します。
整然と配列されるまで、上記の手順を繰り返します。
アルゴリズム
初期状態の時の複雑さに関係する選択ソートの何もない、されたO(N2)はO(n ^ 2)O(N2)。
デフ選択ソート(NUMS):
lenの場合(NUMS)<2:
リターンNUMS
範囲内のiについて(LEN(NUMS)-1):
min_index = I
範囲内のjについて(I + 1、(NUMS)LEN):
もしNUMS [J] <NUMS [min_index]:
min_index = J
NUMS [min_index]、NUMS [I] = NUMS [I]、NUMS [min_index]
リターンNUMS
挿入ソート
核となるアイデアは、すでに部分的に正しい位置を見つけ、配列を注文し、新しい要素を挿入しています。
次のように具体的な手順は次のとおりです。
開かれた二番目の配列要素から、前の要素、交換位置の大きさを決定します。
第3の要素は、最初の2つの要素が正しい位置、第三の挿入要素を見つけるために、大きさによって順序付けされています。
ように、すべての要素が所定の位置になるまで。
アルゴリズム
挿入ソート安定ソート、最適なケースであり、アレイが正である、時間複雑度は、O(N)O(N)O(N)です。最悪の場合の逆は、時間計算量はO(N 2)O(N ^ 2)O(N 2)。
デフinsertSort(NUMS):
lenの場合(NUMS)<2:
リターンNUMS
iについての範囲(1、LEN(NUMS))。
値= NUMS [I]
J = - 1
J> = 0とNUMS [J]>値つつ。
NUMS [J + 1] = NUMS [J]
J - = 1
NUMS [J + 1] =値
リターンNUMS
__name__ == "__main__" の場合:
NUMS = [1,2,9,9,4,5,6,6,3,9,4]
印刷(insertSort(NUMS))
出力:[1、2、3、4、4、5、6、6、9、9、9]
クイックソート
核となるアイデアは、分割し、征服することです。次のように具体的な手順は次のとおりです。
参考として、配列内の要素を選択すると、あなたは、任意の値をとるが、一般的に中央のヘルプを理解することができます。
すべての配列は、大きなベースを右への参照に移動よりも、左側の基準ベンチマークの動きよりも小さい基準比較の配列です。
参照サブアレイの両側に左サブアレイ素子まで、最初の2つのステップを繰り返す新しい配列として。
ソートパーティションのアイデアは大規模なデータセットを処理する効果が優れている、パフォーマンスデータでいくつかの小さな違いが、スケールは挿入ソートに一定の時間スイッチに到達しました。
アルゴリズム
クイックドレーンがある不安定なソート、ある望ましい時間計算量はO(nlogn)O(nlogn)O(nlogn)、Oの最悪の場合の時間複雑度(N 2)O(N ^ 2)O(N 2)。
ヤマガラ最もよく理解選択し、高速な行を達成するために:パーティション+再帰を。
デフクイックソート(NUMS):
lenの場合(NUMS)<2:
リターンNUMS
ミッド= NUMS [LEN(NUMS)// 2]
左、右= []、[]
nums.remove(ミッド)
NUMSでnumの:
NUM> =半ばの場合:
right.append(NUM)
他: 無錫ウィメンズ病院http://www.bhnnk120.com/
left.append(NUM)
クイックソート(左)+ [中期] +クイックソート(右)を返します
__name__ == "__main__" の場合:
NUMS = [1,2,9,9,4,5,6,6,3,9,4]
印刷(クイックソート(NUMS))
出力:[1、2、3、4、4、5、6、6、9、9、9]
マージソート
次のように並べ替えもパーティションの考え方を適用マージ、主な手順は次のとおりです。
n個の要素の元の配列は、順序付けられたシーケンスとみなされます。
ペアワイズは、順序付けられたシーケンスの長さを倍に、マージ。
長さNの順序付けられたシーケンスになるまで上記の手順を繰り返し。
それは見た図と組み合わせることができます。
開始シーケンス[38、27、43、3、9、82、10]は長さ1の7つの配列に分割されます。
ペアワイズマージ4に順序付けられたシーケンスを与えるために[27、38]、[3,43]、[9,82]、[10]。
二十二は、二つの順序付けられたシーケンスを与えるために、再びマージ[3,27,38,43]、[9,10,82]。
7 [3,9,10,27,38,43,82]の長さの最後のマージ順序付けられたシーケンスまで
アルゴリズム
ソートマージソート安定である、O(nlogn)O(nlogn)O(nlogn)は、好ましくは、最悪時の複雑さ、及び従って、望ましい複雑されているO(nlogn)O(nlogn)O(nlogn)。
デフ(左、右)マージ:
RESの= []
I、J = 0、0
私がlen(左)とj <ながら<(右)でlen:
[i]は<=右[j]を放置すれば:
res.append(左[i])と
I + = 1
他:
res.append(右[J])
J + = 1
私は==(左)lenの場合:
RES + =右[J:]
他:
左RES + = [I:]
リターンRES
デフマージソート(NUMS):
場合でlen(NUMS)<= 1:戻りNUMS
半ば= LEN(NUMS)// 2
左=マージ(NUMS [:中間])
右=マージソート(NUMS [半ば:])
リターン・マージ(左、右)
文言を簡素化
二つのポインタの代わりに、.pop動作(.pop時間計算量はO(1)O(1)O(1))。
左または右戻り、他方が空ではないので、必ずしも空の空であると判断されます。
あなたが直接一緒にスプライスすることができますので、左と右の順。
デフ(左、右)マージ:
RESの= []
左と右の間:
左の場合[0] <=右の[0]:
res.append(left.pop(0))
他:
res.append(right.pop(0))
右+左リターンRES +
デフマージソート(NUMS):
場合でlen(NUMS)<= 1:戻りNUMS
半ば= LEN(NUMS)// 2
左=マージ(NUMS [:中間])
右=マージソート(NUMS [半ば:])
リターン・マージ(左、右)
2019年7月15日サプリメント挿入ソート
2019年7月16日サプリメントバブルソートは、比較表を増加させるために、選択します
2019年7月30日のサプリメントは、マージソート