バブルソート
時間の複雑さ:OのO(N ^ 2)宇宙の複雑さ(1)
安定性:安定
- 隣接する要素の比較。最初は、二以上である場合には、それらの2を交換しました。
- 最初から最後のペアの最初の終わりには、隣接する要素のペアごとに同じ作業を行います。これが完了すると、最後の要素は、最大の数です。
- 最後の1を除いて、すべての要素について、これらの手順を繰り返します。
- 比較する必要がなくなるまで、各時間より少ないと少ない要素、数字のペアのための上記の手順を繰り返し続けました。
1 プライベート 静的 ボイドバブルソートは、(int型[] ARR){ 2 用(INT I = 0; Iはarr.lengthを< - 1; ++ I){ 3。 ブールスワップ= falseに; //交換されたか否かを検出、タグを使用して 4 用(INT ; <Iは- - 1 arr.length; ++。J J = 0 J {) 5。 IF(ARR [J]> ARR [J + 1 ]){ 6。 スワップ= trueに; 7。 INT TMP = ARR [J ]; 8 ARR [J] = ARR [J + 1 ]; 9 ARR [Jの+ 1] = ; TMPを 10 } 11 } 12は、 IF(!スワップ){//偽、何の交換は上発生しない、規則的アレイと、プログラムが終了することをスワップ 13が 返す; 14 } 15 } 16 }
バブルソート無用の後に、比較的整然とした配列を避け、最適化されました。
選択ソート
まず、ソート順序が最大の要素には見出されない、開始位置は、ソートされた配列に格納され、その後、シーケンスの終わりにソートされていないとソートの残りの要素から最大の要素を探し続けています。
ように、すべての要素がソートされるまで。
- 最大の要素キーワードを見つけ、照合順序はありません
- 要素が最初にソートされていない配列の最大要素ではない場合、その第一の配列とソートされていない交換エレメント
- ソートが終了するまで、ステップ1と2を繰り返します。
安定:不安定
OのO(N ^ 2)空間の複雑さの時間複雑度(1)
1 公共 静的 ボイド choiceSortは(INT [] ARR){ 2 ため(int型、iはarr.length < - 1; i = 0 iは++ ){ 3 int型 K = I。int型の温度; 4 のための(int型 J = I + 1、J <arr.length; J ++ ){ 5 であれば(ARR [J] < ARR [K]){ 6 K = J。 7 } 8 } 9 であれば(K =!I){ 10 一時=のARR [I]。 11 ARR [I] =のARR [K]。 12の ARR [K] = TEMP。 13 } 14 } 15 }
挿入ソート
直接挿入ソート
注文したシーケンス、ソート操作の基本セットでは、挿入ソートは最高の効率であります
時間の複雑さ:O(N ^ 2)空間計算量:O(1)
安定性:安定した
配列の添字1を横断開始、正面コントラスト、前者はこのループのうち、1未満である場合、次のサイクルのために。
前者が1より大きい場合、前述のシフトの後、前方位置は、このサイクルのうちの一方、空孔よりも小さい最大まで、コントラストを続けます。
1 公共 静的 ボイド insertSortは(INT [] ARR){ 2 ため(int型 i = 1; iは<arr.length; iは++ ){ 3 int型のval = ARR [I]。 4 int型 J = - 1 ; 5 のための(; J> = 0; - J){ 6 場合(ヴァル< ARR [J]){ 7つの ARR [J + 1] = ARR [J]。 8 } 他に ブレーク。 9 } 10の ARR [J + 1] = ヴァル。 11 } 12 }
改善された挿入ソート
適切な挿入位置を見つけるための二分探索法を用いて、比較プロセスが効率を向上させる、減少させることができます
1 公共 静的 ボイド insertSortは(int型[] ARR){ 2 用(INT I = 1; I <arr.length; I ++は){ 3 int型 TEMP = ARR [I]; 4 int型 J = 私は、 5 // 見つけるバイナリサーチ適切な挿入位置 6。 INTまず= 0 ; 7 INT。最終= J-1 ; 8 ながら(最初<= 最終){ 9。 INTミドル=(姓+)/ 2 ; 10 IF(ARR [J] < ARR [ミドル]){ 11 最後=ミドル- 1 。 12 } そう であれば(ARR [J]> {[中間] ARR) 13 第一=中央+ 1 。 14 } 15 } 16 ながら(J> 第一){ 17の ARR [J] = ARR [J-1 ]。 18 j-- 。 19 } 20の ARR [第] = TEMP。 21 } 22 }
高速行
安定性:不安定
O(N ^ 2):時間の複雑さ:O(LOG2 n)の最悪のケース
最適化は、高速行を測定します:
1.場合ある程度、代わりに、挿入配列高速行を使用してのデータの小さい範囲
2.適切な参照番号(乱数処理)(数3を取る)を選択
:クイックソート基本的な考え方リフィルの掘削分割統治+数。
クイックソート分割を使用して、シーケンスは、2つのサブシーケンスに分割されて配置する戦略を征服。
- 列の要素の数、白羽「ベンチマークを。」
- ベースラインの背後に配置された要素の基準値より全て大きい、基部の前方に配置された基準値要素よりも小さい全て、列の順序を変更(同じ番号はどちら側でもよいです)。パーティションの終了後に、参照列の数の中間にあります。これは、パーティション(パーティション)動作と呼ばれます。
- 再帰的に基準値とサブ要素の列の数よりもサブエレメントの数が基準値列よりも大きいです。
1 公共 静的 ボイドクイック(INT [] ARR、int型 I、int型のJ){ 2 3 であれば(I> J) 4 戻り、 5 INT L = partation(ARR、I、J)。 6 クイックソート(ARR、I、L-1 )。 7 クイックソート(ARR、L + 1 、J); 8 } 9 プライベート 静的 INT partation(INT [] ARR、int型 I、int型のJ){ 10 INT一時=のARR [I]。 11 ながら(私は< {j)は 12であり 、一方(I <J && ARR [J]> TEMP)を{ 13であり 、J ; 14 } 15 // 先頭からJを検索する第1の値TEMP未満である 16 IF(Iは< j)を{ 17 ARR [I] = ARR [J]、 18は I ++ ; 19 } 20は 、一方(Iは<J && ARR [I + 1] < TEMP){ 21は ++ I 、 22である } 23である // I + 1つの要素から一時より大きい見つけます値 24 IF(私は< {j)は 25の ARR [j]を= ARR [I + 1 ]。 26 j-- ; 27 } 28 } 29の ARR [I] = TEMP。 30 リターンI; 31 }