オリジナルます。https://www.cnblogs.com/xiaohuiduan/p/11188304.html
テンソートアルゴリズム
基本的なソートアルゴリズム:
- 選択ソート
- 挿入ソート
- バブルソート
効率的なソートアルゴリズム:
- コムソート
- シェルソート
- クイックソート
- ヒープソート
省スペースと時間の効率的な受注を生け贄に捧げます:
- マージソート
- 基数ソート
- 基数ソート
今、私は私自身の見解となり、レッスンは、時間と空間の複雑さを様々な大規模なオンライン注文の長所と短所の神の分析を学びました。
基本的なソートアルゴリズム
選択ソート
理論的根拠:データの残りの要素に最小(または最大)を見つけるために、開始位置の並べ替えを維持するために、素子のアレイ最小(または最大)に見られる、良好な放電素子の背後に配置されています。そして、そのすべての要素がソートされるまでに。(注:括弧内の別の場合、即ち、ソート順序が要素を降順に相当します。)
パブリック 静的 INT []を選択し(int型A []){ int型の分。 以下のために(INT ; I <a.length; iが0 = I ++ ){ 分 = I; 用(INT J = I + 1、J <a.length; J ++ ){ 場合([分]> [J]){ 分 = J; }
//最初の要素は、最小値から取り出されていない場合、交換 IF(分!= I){ 為替(、i、j)は、 } } } } パブリック 静的 ボイド(交換のint []、int型 I、int型のJ){ int型温度= 0 。 もし([I]!= {[J] TEMPは = [I]。 [I] = [J]。 [J] = TEMP。 } }
ソート時間の複雑さを選択します。
比較する最初の行は、N-1倍です。
最小の要素法は、まず、次の時間は、比較する必要はありません。第2の比較必要N-2回。
N-3回を比較する第三の必要性。
.............
N-1回は1を比較する必要があります
総数(N-1)+(N-2)+ ... + 1 = N(N-1)/ 2
例すべての最高の要素は、0回を交換する必要性を注文してきました。
すべての要素が故障している最悪の場合には、スイッチング回数がN-1です。
このため、時間複雑:O(N ^ 2)
宇宙の複雑さの種類を選択します。
最良の場合に順序付け空間複雑さのすべての要素はO(0)です。
すべての要素が故障している最悪の場合には、空間的な複雑さはO(N)です。
平均空間の複雑さはO(1)です。
並べ替えを選択し、不安定です
挿入ソート
理論的根拠:第一要素は第二要素のスキャンを開始する前から後ろへ順序付けられた配列であると考え基であり、整然とした配列に挿入された一つの要素が要素インサート毎に考えられる、あります1つの配列プラス配列の長さ。要素Aが最初の要素よりも小さく、エレメントがあれば、最初の要素、第三元素走査面の前に配置される第一の交換よりも大きくない場合のアプローチは、第二の要素からスキャンバックでありますより最初の要素よりも小さいが小さい第2の要素は、順序内のすべての要素まで、その次とに挿入されます。
例えば:
コードの実装:
パブリック クラスCharu { 公共 ボイドInsertSort(){ int型のTEMP、I、J、 INT [] A = {38,65,97,76,13,27,49 }; のために。I <a.length;(I = 1。 ++ I ){//率層右向き、すなわち、データ比較対象の指標として TEMP = A [I];比較のため//データ int型のインデックス= -I 1。; 一方(インデックス> = 0 && A [インデックス]> TEMP){//未満左または一時出会いと比較ときに、データ、サイクルの終わり 【インデックス +1] = [インデックス]。 インデックス - ; } 【インデックス +1] = TEMP。 } System.out.println(Arrays.toString(a)参照)。 } パブリック 静的 ボイドメイン(文字列[]引数){ charu C = 新しいcharu()。 c.InsertSort(); } }
挿入ソートの時間計算量:
最良のケースは、すべての要素が大きい要素よりも要素をスキャンする前に戻って直接注文、O(N)
最悪の場合:要素は順不同であり、各スキャンする必要がありますスワップ場所
第一、第二の要素をスキャンする、第1の小元素比、比較的一度交換を発見しました。
第二、第三の走査要素は、最初の2つの要素は、2つの時間を比較する必要より小さい見出される、最初の位置は、配列内に挿入されます。
第三に、3回を比較
..........
N番目、N-1要素の正面に見られるN番目の走査要素は、N-1回を比較する必要が、アレイへの最初の位置よりも小さくなっています。
1 + 2 + 3 + ... + N-1 = N(N-1)/ 2の比較合計
時間計算量はO(N ^ 2)
平均的なケース:O(N ^ 2)
このため、時間複雑さの挿入ソートはO(N ^ 2)であります
挿入ソートのスペースの複雑さ:
好ましくは、すべての要素の順序付けられた、Oの空間複雑度(1)
すべての要素の最悪の場合の逆の順序は、空間の複雑さはO(N)であります
平均空間的複雑度はO(1)です。
挿入ソートは安定しています
バブルソート
基本的な原理は:小さな図はゆっくりと上がる、または大規模な数字がゆっくりラウンドサイクルの下端に沈没のほとんどをトップにフロートをシンクまたは。前回値がリア交換の両方の値よりも大きい場合に得られた隣り合う各比較値は、大きい値が徐々に最後に、後退させます。
コードの実装
パブリック クラスMaoPao { パブリック 静的 INT [] maopao(INT [] NUMS){ int型のlen = nums.length。 もし(LEN == 0 || LEN == 1 ){ 戻りNUMS。 } 以下のために(INT I 0 =; I <LEN; I ++ ){ ため(INT J = 0; J <LEN-I-1、J ++ ){ 場合(NUMS [J + 1] < NUMS [J]){ int型の一時= NUMS [J + 1 ]。 NUMS [J +1] = NUMS [J]。 NUMS [J] = TEMP。 } } } リターンNUMS。 } }
パブリック クラスMaoPao { int型 NUMS [] = {2,6,7,1,9,4,3 }。 公共 ボイドmaopao(){ int型のlen = nums.length。 もし(LEN == 0 || LEN == 1 ){ リターン。 } 以下のために(INT I 0 =; I <LEN; I ++ ){ ため(INT J = 0; J <LEN-I-1、J ++ ){ 場合(NUMS [J + 1] < NUMS [J]){ int型の一時= NUMS [J + 1 ]。 NUMS [J +1] = NUMS [J]。 NUMS [J] = TEMP。 } } } System.out.println(Arrays.toString(NUMS))。 } パブリック 静的 ボイドメイン(文字列[]引数){ MAO MaoPao = 新新MaoPao(); mao.maopao(); } }
バブルソート時間の複雑さ:
最悪のケース:私たちは小さなから大規模な配列にしたいが、その後、事前に小さな、不明に大きいです
最初のラウンドは、最小の数は、アレイの最初の位置に移動され、その数はN-1と比較されます。
第二ラウンドの後、第二のピニオンが第1の位置番号に移動させて、数はN-2と比較されます。
..........
N番目のホイール、最大数の最後から二番目の少数フロント移動、比較される数は1です。
比較する合計数は、(N-1)+(N-2)+ ...... + 1 = N(N-1)/ 2。
したがって、Oの最悪の場合の時間複雑度(N ^ 2)。
ベスト:小型から大型まで並ん秩序のすべての要素は、N-1の比較を行います。時間の複雑さはO(N)です。
平均時間計算量はO(N ^ 2)です。
バブルソート、安定ソートアルゴリズムです。
効率的なソートアルゴリズム
クイックソート
理論的根拠:配列(典型的には最初の数)の数字を選択するが、その前に配置され、この数よりも小さい、これより大きな数はその背後に置かれ、互いに数と比較しました。配列は、先にその少ない数のそれは大きいですよりも、将来的には数よりも、業界のために選択した番号から始まる、2つの部分に分かれて、その後、これらの2つの部分はソートアルゴリズムの再帰た後、それを置きます私たちは、ソートに配列全体を達成することができます。
詳細な処理:最初の数は、アレイの参照番号で二ガードが(配列の最初の要素を指す)左右(末端配列要素を指す)、基準数よりも少ない数を見つけるために右に移動権を、聞かせて停止、次いで、参照番号の多数を見つけることよりも、左に移動を開始するために左と、デジタル左及びデジタル権利を停止する(同じことが第1の右の動きである)移動し続ける、交換の意味の範囲内と呼びます。すなわち、ある場合に素子右=左セントリときに、2つ満たし、停止、移動、交換における参照素子数のミーティングポイントの不可避元素「ホーミング」の初めに、このような基準の数左側の右側に、基準数よりも低いです基準数よりも必然的に大きいです。再帰呼び出し、左のベンチマークとして最初の要素への新しい配列、右に「ポスト・ホーミング」の要素は、上記の手順を繰り返します。オーダー内のすべての要素まで。
コードの実装:
以下のためのパッケージ変更suanfa。 パブリック クラスKuaiSuPai { 公共 静的 ボイドクイック(INT [] ARR、intは左、INT 右){ int型I、J、温度、T。 もし(左> 右) のリターン; TEMP = ARR [左]; // 格納されているTEMPが参照番号 =私は左、 J = 右、 しばらく(!私は= Jを){ // 順序がとる権利を見つけることが重要です しばらく(ARR [J]> = TEMP && I < Jを) J - ; // 、次に左から右に見つけることが しばらく(ARR [I] <= TEMP && I < J) I ++ ; // 数値の配列にスワップ二つの位置 IF(I <J)// メイクセントリi及びjは満たしていません { T = ARR [I]。 ARR [I] = ARR [J]。 ARR [J] = T。 } } // 最終的に参照番号ホーミング ARR [左] = ARR [I]。 ARR [I] = TEMP。 クイックソート(ARR、左、I -1 )。 クイックソート(ARR、I 1 、右)。 リターン; } パブリック 静的 ボイドメイン(文字列[]引数){ INT [] ARR = {10,7,2,4,7,62,3,4,2,1,8,9,19 }。 クイックソート(ARR、 0 ,. 1- arr.length); // コールクイックソート、右右端の数の、= 0を左 用(INT I = 0; I <arr.length; I ++ ){ System.out.println(ARR [I])。 } } }
クイックソートの時間計算量:
ベストケース:順序付き要素
時間再帰アルゴリズムの複雑さの式:T [N] =の[N / B] + F(N)
T [N] = 2T [N / 2] + N:最初の再帰時間を比較
比較の第二の再帰数:順序は、n = N / 2は2 ^ 2 T [N /(2 ^ 2)] + 2Nを与える式に代入し
第三の再帰的な照合時間:2 ^ 3 T [N /(2 ^ 3)] + 3N
.............
その結果、N = N /(2 ^(M-1))= 2 ^ M T m番目の再帰の[1] + MN ----------------端(m回後)
最後デュース式が最終的にT [1]を得るために、落下されたことを、均等に分割できない場合、この式は(T [1]は定数である)を超える反復したことを示します。
得るために:T [N /(2 ^ M)] = T [1] === >> N = 2 ^ Mを==== >> M = LOGN。
T [N] = 2 ^ M T [1] + MN;ここで、m = LOGN。
前記n個の要素の数であり、T [N] = 2 ^(LOGN)T [1] + nlogn = N T [1] + nlogn = N + nlogn
したがって後者のテイクnlognすなわち、nlogn> = N(即ちLOGN> 1);及び2とき、N> =ため
総括するには:クイックソートの最適なケースの次回の複雑さを:O(nlogn)
計算出典ます。https://blog.csdn.net/A_BlackMoon/article/details/81064712
最悪の場合、時間の複雑さ:O(N ^ 2)
最悪の状況は、配列の各要素を取ることで、これは実際にバブルソート(毎回行良好な配列エレメント)であり、最小値/最大値であります
バブルソート時間複雑であり、同様に計算する。この場合時間複雑:T [N] = N *(N-1)= N ^ 2 + N。
ヒープソート:
ヒープソートの基本原理:ランダムシーケンスは、ニーズに応じて小規模または大規模なトップ・スタックトップ昇順降順スタックを選択し、スタックを構築します。終了時にスタック要素とスイッチング素子の上部には、最大の要素は、アレイの端に沈むであろう。再調整には、積層構造の定義を満たし、その後交換要素及び要素のスタックの現在のトップの終わりまで継続する、調整を繰り返し順序付きのシーケンス全体まで、+交換工程を実行します。
コードの実装
杭と小さなは、ヒープのトップの上部との間の違いを理解します