バブルソート、選択ソート、挿入ソート(C ++アルゴリズム最適化されたバージョン)

バブルソート

/ *
 * BubbleSort.h
 *バブルソート
 2020年2月10日:*で作成
 *著者:LuYonglei
 * /

#ifndefのSRC_BUBBLESORT_H_
#define SRC_BUBBLESORT_H_ 
する#include <ベクトル>
 使用して 名前空間はstdを、

#if 0

テンプレート <型名T>
 ボイドバブルソート(ベクトル<T>&ARR){
     // 小から大へバブルソート、(予め存在する場合に配列を最適化することができる順序付けられ、これは以下の確率を生じる)
    ためのint型エンド= arr.size() - 1 ; END> 0 ; end-- ){
         // 外部ループトラバース時間が
        BOOLソート=をtrueに ; // 最適化フラグを追加
        するためにint型 =開始1。 ;始める<= END; ++開始) {
             // サイクル及びスイッチング周波数制御コンパレータ内部
            IF(ARR <ARR [開始- [開始] 。1 ]){
                スワップ(ARR [開始ARR、[開始] - 1 ])。
                ソート = ;
            }
        }
        // すでに注文した場合は、早期終了の順序
        IF (ソート)
             BREAK ;
    }
}
#そうしないと

テンプレート <型名T>
 のボイドバブルソート(ベクトル<T>&ARR){
     // 小規模から大規模までバブルソート、(地元のためのシーケンスの終わりには、比較の回数を減らすために、最後の交流の位置を記録することができた場合)
    のためにint型エンド= ARR .size() - 1 ; END> 0 ; end-- ){
         // 外部ループトラバース時間は
        int型 sortedIndex = 0 ; // 最適化インデックスを添加(屈折率は任意に設定されるべきではない、完全に順序付けられたデータの準備完全予め順序付け出口)場合
        のためにint型 =を始める。1 ;始める<= END;始める++ ){
             // インナーループ制御とスイッチング周波数比較
            IF(ARRが<ARR [開始]を[開始- 1。]){
                スワップ(ARR [開始ARR、[開始] - 1 ])。
                sortedIndex = 始めます。
            }
        }
        // 最後に記録された交換位置は、比較の回数削減する 
        エンド= sortedIndexを。
    }
}

#endifの

#endifの / * SRC_BUBBLESORT_H_ * /

選択ソート

/ *
 * SelectionSort.h
 *選択ソート(選択ソートははるかに少ない交換の数よりもバブルソート、平均より優れてバブルソート)
 2020年2月10日:*で作成
 *著者:LuYonglei
 * /

#ifndefのSRC_SELECTIONSORT_H_
#define SRC_SELECTIONSORT_H_ 
する#include <ベクトル>
 使用して 名前空間はstdを、

#if 1

テンプレート <型名T>
 ボイド選択ソート(ベクトル<T>&ARR){
     // 配列から最大の要素、及びスイッチング素子終了位置を選択
    するためのint型の終了= arr.size() - 1 ; END> 0 ; END- - ){
         int型 maxIndex = 0 ; // 要素の最大屈折率
        のためにint型開始= 0 ;始まる<= END;始める++ ){
             IF(ARR [開始]> = ARR [maxIndex])
                maxIndex =始まる; // 最大要素位置の保持指標(ソートアルゴリズムの安定性を確保するため、及びニーズ=)
        }
        スワップ(ARR [maxIndex]、ARR [終了]); //は、最大の要素を選択し、最後の要素の位置を交換し
    }
}
#else 
// ソートアルゴリズムは、アルゴリズムの複雑さを軽減することができて、それはヒープソートに由来し、スタックのための最高の値を選択するために使用
#endifの

#endifの / * SRC_SELECTIONSORT_H_ * /

挿入ソート

/ *
 * InsertionSort.h
 *挿入ソート
 2020年2月11日:*で作成
 *著者:LuYonglei
 * /

#ifndefのSRC_INSERTIONSORT_H_
#define SRC_INSERTIONSORT_H_ 
する#include <ベクトル> 
の#include " BinarySearch.h " 
使用して 名前空間はstdを、

#if 0

テンプレート <型名T>
 ボイド挿入ソート(ベクトル<T>&ARR){
     ため(=始まるsize_tの1。 ; <)(arr.size始まる; ++始まる){
         int型の端= 始まる;
         // 要素の端要素が少ないエンド1を超える場合交換位置、そうでなければループのうち
        一方(完> 0 &&(ARR [終了] <ARR [エンド- 1 ])){
            スワップ(ARR [終了]、[終了ARR - 1 ])。
            エンド - ;
        }
    }
}

#elifの 0

// 最適化は、代わりに交換を移動します
テンプレート<型名T>
ボイド挿入ソート(ベクトル<T>&ARR){
     ため(=始まるSIZE_T 1 ; <(arr.size開始); ++始まる){
         int型 =端を始めます。
        値T = ARR [END];
         // 端部要素は、そうでなければ、ループの外に、エンド1素子を覆うように素子端と端-1元素よりも小さい場合には
        、一方(エンド> 0 &&(値<ARR [エンド- 1 ])){
            ARR [END] = ARR [エンド- 1 ]。
            エンド - ;
        }
        ARR [END] = 値。
    }
}

#そうしないと

// 部品のバイナリ検索の最適化(比較回数の再最適化に基づいて動きを)命じました
テンプレート<型名T>
ボイド挿入ソート(ベクトル<T>&ARR){
     ため(=始まるSIZE_T 1 ; <(arr.size開始);始める++ ){
        値T = ARR [開始]; // 値を挿入するために、保存
        int型のインデックス= indexOfInsertion(ARR、開始、値); // 位置を挿入するために取得
         // 移動要素
        のためのINT I>索引; I =開始をI- - ){
            ARR [I] = ARR [I - 1 ]。
        }
        ARR [インデックス] = 値。
    }
}

#endifの

#endifの / * SRC_INSERTIONSORT_H_ * /

バイナリサーチを用いた最適化に挿入ソート

/ *
 * BinarySearch.h
 *バイナリ検索
 *ので、エンド開始=サイズという、左右からの配列の範囲が開閉とするという便利なエンコーディングを確保するようにしてください
 2020年2月11日:*で作成
 *著者:LuYonglei
 * /

#ifndefのSRC_BINARYSEARCH_H_
#define SRC_BINARYSEARCH_H_ 
する#include <ベクトル>
 使用して 名前空間はstdを、
#define ELEMENT_NOT_FIND -1

// 配列arrで注文した位置に、検索値
テンプレート<型名T>
INT(のindexOf CONSTベクトル<T>&ARR、int型の{サイズ、T値)
     INT ARRAYSIZE = arr.size();
     IF(ARRAYSIZE == 0 ||サイズ<= 0 || ARRAYSIZE < サイズ)
         戻りELEMENT_NOT_FIND;
     intは開始= 0 ; // トップ要素のインデックス
    int型エンド=サイズ; // の最後の要素のインデックス
    ながら(開始< エンド){
         int型ミドル=(開始端+)/ 2 ;
         IF(値< ARR [ミドル]) {
            終了 = ミドル。
        } そう であれば(値> ARR [中央]){
            開始 = +中間1 
        } {
             // 値== ARR [中間] 
            戻り中間。
        }
    }
    リターンELEMENT_NOT_FIND。
}

// 位置に挿入される値は、配列ARR順序付け見つける
 // 最初の位置よりも順序付けられた配列値より大きいと
テンプレート<型名T>
INT indexOfInsertion(constのベクトル<T>&ARR、INT サイズ、T値){
     // 再度挿入バイナリ探索の安定性を確保するために
    INT ARRAYSIZE = arr.size();
     IF(ARRAYSIZE == 0 ||サイズ<= 0 || <ARRAYSIZE サイズ)
         戻りELEMENT_NOT_FINDと、
     INT始める= 0 ; // トップ要素のインデックス
    int型エンド=サイズ; // の最後の要素のインデックス
    ながら(<開始終了){
         int型ミドル=(+終了を始めます) / 2 ;
         IF(値< ARR [中央]){
            終了 = ミドル。
        } {
             // 値> = ARR [中間] 
            始める=中央+ 1 
        }
    }
    // この時点で開始終了== 
    返し始めます。
}

#endifの / * SRC_BINARYSEARCH_H_ * /

 

おすすめ

転載: www.cnblogs.com/luyl/p/12377487.html