また、(ソートアルゴリズム)として知られているアルゴリズムをソート1.ソート、ソート処理は、指定された順にソートされたデータの集合であります
分類の1.1ソート
(1)内部ソート:に追加された処理対象の全てのデータを意味する内部メモリために。
(2)外部ソート:データは、すべてのメモリにロードするには大きすぎる、それが必要とする外部記憶ソートを
1.2共通ソート
(1)内部ソート:ソート(シェルソート、直接挿入ソート)を挿入し、選択ソート(単純選択ソート、ヒープ・ソート)、交換ソーティング(バブルソート、クイックソート)、マージソート、ソート基数
(2)外部ソート
1.3アルゴリズムの複雑さの時間 - アルゴリズムの実行時間を計測するには、2つの方法
(1)統計的手法は、事後 - 実行時に最初に実行した表情
- 評価のためのアルゴリズム設計の性能に実行するには、我々は実際にプログラムを実行する必要があります
- 時間を結果の統計では、コンピュータのハードウェア、ソフトウェア、および他の環境要因に依存します
(2)事前に推定する方法を
- どのアルゴリズムより良いアルゴリズムの時間複雑さを分析することによって判断すること
(3)時間周波数
-ステートメントのアルゴリズムでアルゴリズムと一緒に過ごした時間の実行時間より頻繁に実行するためのアルゴリズムに比例し、ステートメントは、それは時間と多くを取ります。アルゴリズムの実行命令文は、周波数または時間周波数と呼ばれる回数は、T(N)と呼びます。
(4)時間計算
- 一般的に、アルゴリズム実行文の基本的な動作の繰り返し回数は、F(n)で表され、もし補助関数F(n)は、そのようなことが問題サイズnの関数である場合、N無限大に近づきます、T(N)/ F(n)が一定の限界値と等しくない次いでfと、0であり、(n)はT(n)が同程度の関数です。T(N)= Oで表される(F(N)、アルゴリズムの進行時間の複雑さ、短い時間の複雑さです)
-T(n)は異なるが、同一の時間複雑であってもよいです。
- 計算時間の複雑さの方法:
- 1定数によっては、追加の定数ランタイムのすべてを交換します
-の数は、改訂の関数を実行のみ最高次の項を保持します
-最高次項の除去係数
- 一般的な時間複雑
-注文Oの定数(1)、(ログオーダーOの2 N-)を、線形順序O(N)、O(nlogの線形順序2 N-)、オーダーはO(n ^ 2)、立方オーダーO(の正方形N ^ 3)、オーダーはO(n ^ k)はk番目の指数オーダーO(2 ^ N)
- 上記の一般的なアルゴリズムの時間複雑さの昇順は、時間複雑性は低く、アルゴリズムの実行の効率を増加さ
- 平均時間複雑度は:すべての可能な入力の場合を意味して、等しい確率インスタンスにアルゴリズムの実行時間が表示され
- 最悪の場合の時間複雑:時間複雑性は最悪の場合、一般的に時間の複雑性を議論され、最悪の場合の時間の複雑さは、入力時間インスタンスのいずれかで実行されている怖い制限アルゴリズムであります
- 平均時間の複雑さと同じかどうかに関連するアルゴリズムの最悪時の複雑
整理 | 平均時間 | 最悪の場合 | 安定 | 追加のスペース | リマーク |
バブル | O(N 2) | O(N 2) | 安定しました | O(1) | n時間よりよいです |
為替 | O(N 2) | O(N 2) | 不安定な | O(1) | n時間よりよいです |
選択 | O(N 2) | O(N 2) | 不安定な | O(1) | n時間よりよいです |
挿入 | O(N 2) | O(N 2) | 安定しました | O(1) | 最も良い注文したとき |
カーディナル数 | O(ログR B)を | O(ログR B)を | 安定しました | O(n) | Bが真数(0-9)であり、Rは、基数(千)であります |
シェル | O(nlogn) | O(N S)1 <S <2 | 不安定な | O(1) | sがパケットを選択します |
速いです | O(nlogn) | O(N 2) | 不安定な | O(nlogn) | より良いnは大 |
合併 | O(nlogn) | O(nlogn) | 安定しました | O(1) | より良いnは大 |
ヒープ | O(nlogn) | O(nlogn) | 不安定な | O(1) | より良いnは大 |
(5)アルゴリズムの空間の複雑さを
- アルゴリズム(空間複雑さ)の空間的な複雑さは、アルゴリズムによって消費される記憶空間として定義され、占有一時記憶空間の動作中のアルゴリズムの尺度です。一時的な仕事は、nが大きい場合、それはより多くのメモリセルを取るだろう、それがnの増加に伴いだ、ユニットの数と関連するn個の大きさの問題を解決するためにいくつかのアルゴリズムを占有する必要があります。
- アルゴリズム分析の焦点は、ユーザーの経験にプログラムの実行速度に重点を置く、時間の複雑さです。いくつかのキャッシング製品(Redisの、memcacheの)とアルゴリズム(基数ソート)は、本質的に時間のためのスペースです。
2.バブルソート(バブルソート)
2.1思想:処理することにより、シーケンスを順序付け前後を順次、隣接する要素の値を比較見つかった場合、スイッチは前方から後方に向かって素子の主キーの大きい方の値を反転させます。要素がその場所に近い保つダウン交換されていない旅行を比較するときにソート処理は、順序付けられた命令のシーケンスは、このようにフラグFLAGを設定する分類処理の要素を交換することにより、不要なを低減するか否かを判断するため比較(最適化が終了したバブリングに書き込むことができます)。
規則2.2
(1)サイクルタイムの配列の合計サイズ-1
(2)倍の数は、各旅行は減少で順序付け
それは一種の旅で発見された場合(3)、交換は一度発生しませんでした、バブルソート(最適化)途中で終了することができます
2.3ソースコード
パブリック 静的 ボイドバブルソート(INT [] ARR){ // TODO自動生成されたメソッドスタブ // バブルソートの発生が、時間複雑度はO(N-2 ^) ブールフラグに= falseに ; // か否かを示す、識別変数を定義交換され、何の切り替えが偽でない、交換が真である int型の TEMP = 0; // 一時変数 のためには、(int型 ; Iは<-arr.length 1。I ++はI = 0 ){ // 各パスが想定されていないの開始前であることが交換 フラグ=でfalseに、 のために(INT J = 0; J <-arr.length 1-I; J ++ ){ // 番号は番号の前に後者よりも大きい場合、スイッチ もし(ARR [J]> ARR [J + 1 ]){ フラグに = trueに ; // あっ交換 TEMP = ARR [J]; ARR [J] = ARR [J + 1 ]; ARR [J + +1] = TEMP ; } } System.out.printf( "ランソートの%のD:"、I + 1 ); (Arrays.toString(ARR)の)のSystem.out.println; // 場合旅行は、交換の終了か否かが判断されます時間が交換されていない、バブルソートが終了し たIF(!フラグに){ BREAK ; } } }
3.選択ソート(並べ替えを選択)
3.1データをソートする必要性から、要素が交換位置後の再順序付けの目的に応じて、指定された規則に従って選択される、内部ソートです。
3.2思想:[0] -arr [N-1]を選択し、最小値、および[0]交換をARR ARRからの第1、[1] -arr ARR二度目は[N-1]の最小値を選択し、およびARRの[1] ...、N-1回の合計によってARR [N-2]の切り替えと最小ARRから選択されたn-1回[N-2] -arrを[N-1]、交換大規則正しい配列配置に小さな注文コードを取得します。
3.3説明
(1)総アレイサイズの選択、ソート、ソートホイール-1
(2)一種当たり、それはこの数に電流を仮定サイクルが、最小の数であり、その後数の現在の数よりも少ないがある場合、それは最小数を再決定され、後者の数をそれぞれ比較し、そして添字を取得
(3)最後に最小数と添字ラウンドを取得するために、アレイを横切ったとき
(4)交換
3.4ソースコード
パッケージcn.atguigu.sort。 輸入java.text.SimpleDateFormatの。 輸入java.util.Arrays。 輸入java.util.Date; パブリック クラスSelectSort { 公共 静的 ボイドメイン(文字列[]引数){ // TODO自動生成方法スタブ // INT [] ARR = {101,34,119,1}。 INT [] ARR = 新しい int型 [80000 ]; 以下のために(int型、I <80000は、I = 0 iは++ ){ ARR [I] =(INT)Math.random()* 8000000 。 } 日付DATE1 = 新しい日付(); SimpleDateFormatのSimpleDateFormat = 新しいてSimpleDateFormat( "YYYY-MM-DD HH:MM:SS" )。 ストリングdate1Str = simpleDateFormat.format(DATE1)。 System.out.println( "排序前时间" + date1Str)。 selectSort(ARR)。 日付日付2 = 新しい日付(); ストリングdate2Str = simpleDateFormat.format(DATE2)。 System.out.println( "排序后时间" + date2Str)。 } パブリック 静的 ボイド selectSort(int型{ARR []) INT分= 0 ; int型 minIndex = 0; // 最小添字 ブールフラグに= falseに、 のために(int型 I = 0;私は<arr.length; I ++は){ 分 = ARR [I]; // 想定自体分 フラグ=においてfalseに、 のために(INT J = I + 1を; J <arr.length; J ++ ){ IF(MIN> ARR [J]){ 分 = ARR [J]は; // 検索[I + 1 ] -a間の最小[N-1]、添字の最小値は覚え minIndex = Jと、 フラグに= trueに; } } IF (フラグに){ // 交換 ARR [minIndex] = ARR [I]; ARR [I] = 分; } } } }