ディレクトリ
1.クイックソートクイックソート
- また、交換ソート分割(パーティション交換ソート)としても知られています
- すべてのデータの他の部分よりもデータの全ての部分があると、前記トリップデータを順序付けることによって、二つの別々の部分に分類します
- この方法データの2つの部分はすぐにソートされ、その後、全体のソート処理を再帰的にすることができ
ステップ1.1
- 「参照」と呼ばれる、一連の1つの要素を選択(ピボット)
- ソート順序は、基準要素の前に置か要素が基準値よりも小さい場合、基準値は、すべての要素が基準に戻るよりも大きいです
- 同じ番号が統一のように、両側に置くことができます
- パーティションの終了後に、参照列の数の中間位置(実際には、その最終的な位置)にあります
- これは、パーティション(パーティション)動作と呼ばれます
- 再帰基準値よりも列の数とサブ要素値をサブエレメント列のソートの基準数よりも大きい場合(これを再帰的)
- 再帰輸出:列数の大きさがゼロまたはAであります
- それはソートされている良いです
- 少なくとも一つの元素をその最終位置に置かなる各反復(繰り返し)、なぜなら
1.2パフォーマンス分析
- 最適な時間の複雑さ:O(nlogn)
- 最悪時間計算量:O(N- 2)
- 安定性:不安定
1.3 Pythonのコードサンプル
- 高速タイプセットバージョンが一意ではありません
- これは、高速思考の行、よりコストのスペースを考えることができます
from random import randrange
def quick_sort(lst):
n = len(lst)
if n <= 1:
return lst
pivot = lst[-1]
front, rear = [], []
for i in range(n-1):
if lst[i] < pivot:
front.append(lst[i])
else:
rear.append(lst[i])
return quick_sort(front) + [pivot] + quick_sort(rear)
if __name__ == "__main__":
lst = [randrange(10, 100) for _ in range(10)]
print(">>> before sort:", lst)
new_list = quick_sort(lst)
print(">>> after sort: ", new_list)
- クイックドレンが向上します
from random import randrange
def quick_sort(lst, start, stop):
if stop <= start:
return
pivot = lst[stop]
low, high = start, stop
while low < high:
while low < high and lst[low] < pivot:
low += 1
lst[high] = lst[low]
while low < high and pivot <= lst[high]:
high -= 1
lst[low] = lst[high]
lst[low] = pivot
quick_sort(lst, start, low-1)
quick_sort(lst, low+1, stop)
if __name__ == "__main__":
lst = [randrange(10, 100) for _ in range(10)]
print(">>> before sort:", lst)
quick_sort(lst, 0, len(lst)-1)
print(">>> after sort: ", lst)
2.マージソートマージソート
ステップ2.1
- それは最初言う:要素の列の数は出口に、1以下である場合
- 列の数は半減します
- 左は、再帰的にソートします
- 再帰的に右のソート
- 左右のマージ
2.2パフォーマンス分析
- 最適な時間の複雑さ:O(nlogn)
- 最悪時間計算量:O(nlogn)
- 安定性:安定
2.3 Pythonのコードサンプル
from random import randrange
def merge_sort(lst):
n = len(lst)
if n <= 1:
return lst
mid = n // 2
left = merge_sort(lst[:mid])
right = merge_sort(lst[mid:])
return merge(left, right)
def merge(left, right):
L, R = 0, 0
result = []
nL, nR = len(left), len(right)
while L < nL and R < nR:
if left[L] < right[R]:
result.append(left[L])
L += 1
else:
result.append(right[R])
R += 1
if L < nL:
result += left[L:]
if R < nR:
result += right[R:]
return result
if __name__ == "__main__":
lst = [randrange(10, 100) for _ in range(10)]
print(">>> before sort:", lst)
sorted_list = merge_sort(lst)
print(">>> after sort: ", sorted_list)