バブルソートやクイックソートアルゴリズム

前文:

バブルソートアルゴリズム

二つのバブルソートプログラムの実現

三つのクイックソートアルゴリズム

四のクイックソートアルゴリズムプログラムの実現

最初のバブルソートアルゴリズム

簡単な紹介

バブルソート(バブルソート)、コンピュータサイエンスである単純なソートアルゴリズムフィールド

その順序は、エラー(例えば、下降、ZのAから最初の文字として)、それらが交換引き継いだ場合は繰り返し、二つの隣接する要素を比較するために、ソートする列の要素を訪問しました。素子列が完成ソートされていると言うことですスワップ隣接する要素の必要は、存在しなくなるまでの作業の訪問要素が繰り返されます。

二酸化炭素は、炭酸飲料中の気泡かのように名前が大きい要素は徐々に列番号の上部(昇順または降順)に「フロート」を介して交換する実際のアルゴリズムから来る、最終的に同じ、それゆえ名「バブルの上面に浮きますソート。 "

原則

次のように原則バブルソートのアルゴリズムは次のとおりです。

  1. 隣接する要素の比較。最初は、二以上である場合には、それらの2を交換しました。

  2. 最初のペアの最初から最後のペアの終わりに、隣接する要素のペアごとに同じ作業を行います。この時点で、それは最後の要素は、最大数であるべきです。

  3. 最後の1を除いて、すべての要素について、これらの手順を繰り返します。

  4. 比較する必要がなくなるまで、各時間より少ないと少ない要素、数字のペアのための上記の手順を繰り返し続けました。

アルゴリズム分析

時間複雑

初期状態は、正シーケンスファイルであれば、人は注文を完了するために渡します。比較の数は、キーワードを必要と し、携帯電話の番号を記録します  

持っては最小に達しました。

  、

  。

したがって、最高のバブルソートの時間複雑さがあります   。
元のファイルは、逆の順序での必要性である場合

  

旅の並べ替え。トリップごとに並べ替えるには

  

時間の比較キーワード(1≤i≤n-1)、及び各比較のレコードは、レコード交換位置を達成するために3回移動させなければなりません。この場合、比較及びモバイルの最大数に達しました。

バブルソートの最悪時間計算量は、

  。

 [1]  要約すると、したがって、全体的な平均バブルソート時間複雑です

  。

アルゴリズムの安定性

バブルソート少しの要素が大きな要素で前方または後方に移動されます。二つの隣接する要素の比較はまた、交換は、これら二つの要素の間で起こる、以上です。二つの要素が等しい場合、したがって、その後の交換はしないであろう。ペアワイズによるフロント隣接する2つのアップを交換する場合であっても、無隣接する二つの等しい要素場合、この時間は、同じ要素を交換することはできませんバブルソート安定ソートアルゴリズムであるので、前と後の順序は、変更されていません。

第二バブルソートアルゴリズム

C言語

する#include <stdio.hに>
の#define ARR_LEN配列の255 / *最大の長さ* /
の#define elemType INT / *エレメントタイプ* /
/ *バブルソート* /
/ * 1の電流要素から、後方に順次それぞれを比較隣接要素、もし逆切替* /
/ * 2リピート最後の要素までのすべての要素のための上記の手順、* /
/ * elemType ARR []:ターゲット配列をソートする; INT LEN:要素の数* /
ボイドバブルソート(elemType ARR []、INT LEN){
    elemTypeのTEMP;
    INT I、Jは、
    のためには、(I 0 =; I <LEN-1; I ++)/ *外側のループはラップ数、lenの-1回lenの数をソートすることです* /
        のため(J = 0; J <。len- 1-I; J ++){/ *内側ループがトリップ比較あたりの回数は、i番目のトリップコンパレータがlen-iの時間* /
            IF(ARR [J]> ARR [J + 1]){/ *比較する隣接する要素は、スイッチときに逆の順序(左昇順に右より大きく、下降及びその逆)* /
                TEMP = ARR [J];
                ARR [J] = ARR [J + 1];
                ARR [J + 1] = TEMP;
            }
        }
}
 
INTメイン(ボイド){
    elemType ARR [ARR_LEN] = {3,5,1、-7,4,9、-6,8,10,4}。
    int型のlen = 10;
    私はint型。
    バブルソート(ARR、LEN)。
    (I ++; I <lenのI = 0)するため
        のprintf( "%D \ T"、[I] ARR)。
    putchar( '\ n'は);
    0を返します。
}

3クイックソートアルゴリズム

クイックソート(クイックソート)バブルソートの改善です。

クイックソート1960年にCARホーアによって提案されました。基本的な考え方は次のとおりです。個別に速い二つの独立した部品は、すべてのデータの他の部分よりも、すべてのデータが小さくなるように一部、二部のためのデータのこの方法に分類されるデータを順序付けることによって旅ソート、プロセス全体をソートすると、順序付けられたシーケンスにデータ全体を達成するために、再帰的にすることができます。

配列Aをソートするために設けられている[0] ... A [N-1]、最初のデータのいずれか(最初の番号は、通常、アレイ選択される)データをキーとして、[すべてが中に配置されている数よりも少ないの選択左は、その数字よりも、すべての大きい方がその右に、クイックソートへの旅として知られているプロセスに入れています。これは、クイックソートアルゴリズムを選別的に安定であること、値の複数の同一の相対位置は、アルゴリズムの終了時に変動することはない、ことは注目に値します。

クイックソートアルゴリズムへの旅は、次のとおりです。

1)2つのセットの変数i、jは、ソートの先頭に:私は= 0、J = N-1;

2)に割り当てられた鍵データである第1の配列要素へのキー、すなわちキー = A [0]。

3)すなわち、順方向検索(J)から出発して、以下最初より見つけるために、Jから出発して前方に検索キー値A [J]、A [J]とA [i]の値の交換;

4)私は、すなわち、逆方向検索(I ++)の開始前に、最初はより大きい見つけ、検索後方から開始キー、A [i]が、A [i]とA [j]の値の交換の

iがjは=まで5)を繰り返して、3および4ステップ;(3,4-ステップ、すなわち3 A [j]が以下ではない、修飾された値を見つけられませんでしたキーで、4 A [I]は、以下である。キー時間Jを変え、私ようにJ = J-1の値が、私は= 、I + 1のとき、私引き換え、そのままJポインタの位置、あなたが、見つかった資格の価値を見つけるまで。さらに、私== jのことこのプロセスは、正確に時間でなければなりませんI + J-または完了したので、その今回のサイクルの終わり)で。

缶関数のqsort()はC言語で直接配列を注文することができます。 

使用法:

空のqsort(void *型ベース、int型nelem個、int型の幅、int型(* FCMP)(定数無効*、constの無効*));

パラメータ:
  ソートされた配列された最初のアドレス
  ソートされた配列要素数であると2
  の各要素のサイズフットプリントで3
  ポインタ順次順序を決定するための4点関数

時間複雑

O(nlogn)の最良の時間の複雑さは、プロセスが複雑である、それはここでは繰り返しません。

各数字(参照番号)への最悪の場合を取る比較する電流の最大値/最小値は、この場合、各時間はわずか1未満のシーケンス番号を取得することです(すなわち、いずれかのすべての基準数よりも大きい、または完全な基準よりも小さい)、その後、バブルソートと等価であり、比較の数=(N - 1)+(N - 2)+ ... + 2 + 1 =( N - 1)* N / 2、この場合、時間複雑である:O(N ^ 2)。通常は、最悪の場合に表示されます。ソートされたデータそのものであることをすでに良い正シーケンスまたは逆順行です。

宇宙複雑

  一部の人々が悪いように計算仕分け非場所を、使用しているため、実際には、これは、良好な空間的複雑さの計算ではありません(あなたの要素の数を計算する必要があるので、一部の人々は、補助配列を使用しているため) ;私はそれのクイックソートの複雑さの下で、その場のスペースに分析します。

        必要各再帰的にデータの一部を維持するため、実空間を再帰呼び出しによって消費され、使用される1位クイック空間は一定であるO(1)です。

     最適な場合、空間複雑:O(LOGN);二分アレイ都度ケース

     最悪の場合の空間の複雑さがある:O(n)は、バブルソートの縮退ケース

 

第四に  クイックソートアルゴリズムプログラムの実現

より高速のクイックソートバブルソートと比較するため、それぞれの交換が飛躍的です。設定された基準点をソートするたびに、基準点は、基準点の左側に配置された全ての数にほぼ等しいよりなり、基準点は、数よりも大きいが、右点に合計基準に等しくなります。交換はバブルソートと同じにはなりませんたびにのみ大きなよりの交換局から隣接する数字間で交換することができますので。したがって、比較及び交換の総数が少ない自然速度を増加させることになる有します。もちろん、最悪の場合には、それはまだ交換された隣接数2かもしれません。クイックソートとバブルソートの最悪時間計算量は同じであるので、O(N2)、O(NlogN)のその平均時間の複雑さがあります。

クイックソート:
の#include <stdio.hの>
INT A [101]、N-; //グローバル変数を定義し、これらの変数は、中の2つのサブ機能の使用が必要
{(intは、INT右を左)空隙クイックソートを
    、INT I、J T、TEMP;
    IF(左>右)の
        リターン;
    TEMP = [左]; // TEMPを参照番号に格納されている
    。私は左。=
    Jは右=; (!
    私はJ =)を、一方{//順序は、重要です第1の右から検索するための
        一方([J]> = TEMP && I <J)
            J ,;
        一方([I] <= TEMP && I <J)//右見つける
            ++ Iを、       
        IF(Iを< j)は2つの配列番号で//スワップ場所
        {
            T = [I]、
            [I]は= [J]、
            [J] = T;
        }
    }
    //ホーミング参照番号は最終的に
    [ ] = [I]を残しました。
    [I]は= TEMP;
    クイック(左,. 1-I); //左の処理を続け、再帰的な処理がある
    クイックソート(I + 1、右)が ; // 右の処理を続け、再帰ありますプロセス
}
(INTメイン){
    int型I;
    //リードデータ
    scanfの( "%のD"、およびN-);
    のための(I = 1; I <= N; I ++)
        scanfの( "%のD"、&A [I]) 、
    クイックソート(N-1); //コールクイック
    //出力をソートした後
    ためには、(i = 1; Iは<N-; I ++)
        のprintf( "%のD"、[I]);
    のprintf(「%Dを\「N-、A [N-]);
    戻り0;
}
 

 

公開された43元の記事 ウォン称賛28 ビュー40000 +

おすすめ

転載: blog.csdn.net/u013380694/article/details/90169202