時間的/空間的複雑さ、ベースのソートアルゴリズム(バブル、選択し、迅速、挿入)

まず、時間の複雑さ、スペースの複雑さ

時間の複雑さ:Oとアルゴリズムの効率を評価するために使用されるもの、()表現

例の時間複雑さの計算:

印刷' Hello Worldの'O(1)
 I におけるレンジ(N):#nのサイクルは
      印刷' Hello Worldの'O(N-)
 I におけるレンジ(N):
     のための J でのレンジ(N):N#2ネストされたループは、
         印刷' Hello Worldのを'O(N²)

それを次のコード時間複雑?

印刷' Hello Worldの' を印刷' こんにちはPythonの' #は3回の実行を見ている)が、また、O(1)
 印刷( 'こんにちはMathimatics-数値アルゴリズム')         O(1)
以下のための:範囲(n)を
     印刷' Hello Worldの')
        のための J での範囲(N):
             印刷' Hello Worldの'O(n²)

それを次のコードの時間複雑?

一方、 N - > 1 プリント(N-)
    N- = N-2 // 

2 ^ 64 6 = 
IOG2 ^ = 64 6 
ので、時間計算量であること:(IOG2はO ^ N-)、またOとして使用することができる(LOGN)

時間計算の概要:

1.アルゴリズムの時間複雑度は時間(単位)の実行方程式を推定するために使用されます。
一般的に2、アルゴリズムの時間計算は、アルゴリズムの高い複雑度が遅いよりも低いです。

時間の複雑さを判断するには?

1.半サイクルプロセス:O(LOGN)
複雑さは2 n回サイクルいくつかの側面であります

宇宙複雑:アルゴリズムのメモリフットプリントの大きさを評価するために使用される式。

用途:時間のためのスペース

第二に、リストがソートされています

順番に番号なしリストのリスト:リストをソート

入力:順不同リスト

出力:順序付きリスト

いくつかの一般的なソートアルゴリズム:などバブルソート、選択ソート、挿入ソート、クイックソート、

1.バブルソート

アイデア:

1.フロントの後ろより大きい場合には、その2を交換するために、隣接する2つの番号を比較し、順序なしリストを持っています

最後の要素が最大値であるように、最初から最後のペアの最初の終わりに、隣人のために同じ仕事をしてそれぞれについて、2。

最後の1を除いて、上記の手順を繰り返します。3.

だから我々は2つのサイクルのために書きます:

ループ関数の最初:選別のラウンド数を制御します

ループアクションの第二:比較器の各々における各ラウンドの制御

バブルソートのコードは次のとおりです。

リー= [4,1,3,6,7,9,2,5,8 ]
 DEF :Bubble_sort(LI)
     のための I における範囲(-1でlen(LI) :)
         のために、J における範囲(LEN(LI) - 1- I):
             もしリチウム[J]>のLi [J + 1 ]:
                リチウム[J]、リチウム[J +1] =のLi [J + 1 ]、リチウム[J]
     プリント(LI)
Bubble_sort(LI)   排序结果[1、2、3、4、5、6、7、8、9]

バブルソートの時間計算量:O(n²)、空間的複雑度はO(1)であります

バブルソートの最適化:

気泡がソート為替への旅行なしで実行された場合は、リストは状態を発注してきた、それが直接、アルゴリズムは終了することができます。

 

 

2. [ソート 

アイデア:

第一の位置に、レコードの最小数を横切る1トリップ。

2.その後は、場所に残っているリストの数のレコードを通じ最小の旅を続けます

0の値を取るインデックスのリスト、および位置を交換され、他の位置での値が0よりも指標値より大きいと比較して、素子の後方位置:として理解することができます。比較のすべての要素にわたって0のインデックス値は、順次インデックスの値を比較するインデックス値1と次の要素が他の位置の値よりも大きい小から大へ、そう上の位置を入れ替え、そしてれます。

ソートコード例を選択します。

リー= [4,3,6,1,7,9,2,5,8 ] 

DEF select_sort(LI):
     のための I における範囲(LEN(LI)):
        MINLOC =と    ## = 0 
        のため、J 、及び範囲(I + 1 、(LI)LEN):
             もし [J] < :リチウム[MINLOC] 
                のLi [J]、[MINLOC] = [MINLOC]、[J]
     プリント(LI)
select_sort(LI)    #结果[1、2、3、4、5、6、7、8、9]

選択ソートの時間計算量:O(n²)、空間的な複雑さはO(1)であります

3.挿入ソート

アイデア:カードを挿入し、同様地主

1.リストは2つの部分に分割されるが抽出、領域及び不規則領域、最初の順序付けられた領域の一つの要素を注文した場合、最初の要素

2.障害が空き領域になるまで1つの障害のそれぞれからの要素、挿入領域の順序付けられた位置、および比較の順序付けられた領域の11の値を選択

コードサンプルの挿入ソート:

リー= [4,3,6,1,7,9,2,5,8 ]
 DEF insert_sort(LI)
     のために、私は範囲(1 、lenの(LI)):
        TMP = リチウム[i]は
        J = I - 1
         一方、 jは> = 0 のLi [J]> TMP:
            リチウム[J +1] = リチウム[J] 
            J = J - 1 
        のLi [J +1] = tmpに
     プリント(LI)
insert_sort(LI)    1 [#结果、2、3、4、5、6、7、8、9]

挿入ソート時間計算:O(n²)、空間的複雑度はO(1)であります

4.クイックソート

最速で約書き込みにアルゴリズムを並べ替え、書面で最高の高速なソートアルゴリズムは、(以前にもいくつかのより複雑な書き込み)

アイデア:

列番号(一般的に最初の要素)から要素を削除1.「参照」と呼びます

2.書き込み数並べ替え列の機能は、すべての要素が左側の基準ベンチマークよりも小さい、すべての要素が右側の参照、同じ側に同じ数よりも大きいです。パーティション終了後、中間位置の列の数に基づいて。

3.書き込み機能、基準値よりも再帰的サブ要素は、列の数と列の数の要素の並べ替えの基準値よりも大きいです。再帰のボトムケースは、サイズが列の数は、常に十分にソートされている、すなわち、0または1です。それは再帰でしたが、このアルゴリズムは常にあるため、各反復では、終了しますが、それは、その最終的な位置に配置された少なくとも一つの要素が行くでしょう。

クイックソートのキーポイント:1つの統合、2再帰。

 

 

 クイックソートのコード例:

li=[4,3,6,1,7,9,2,5,8]
#第一个函数,根据基准分区
def partition(li, left, right):
    tmp = li[left]
    while left < right:
        while left < right and li[right] >= tmp:
            right = right - 1
        li[left] = li[right]
        while left < right and li[left] <= tmp:
            left = left + 1
        li[right] = li[left]
    li[left] = tmp

    return left
#第二个函数使用迭代
def quick_sort(li, left, right):
    if left < right:
        mid = partition(li, left, right)
        quick_sort(li, left, mid-1)
        quick_sort(li, mid+1, right)
        print(li)
quick_sort(li, 0, len(li)-1)     #结果:[1, 2, 3, 4, 5, 6, 7, 8, 9]

快速排序时间复杂度:O(nlogn),空间复杂度:O(logn)

 

未完。。。。

おすすめ

転載: www.cnblogs.com/wangcuican/p/12094060.html