今回もソートです。バブルソートを発展させて、別のアルゴリズムを考えてみましょう。
では、今回の要点です。
では、いってみましょう。
前回のバブルソートでは、最大のものを探しつつ同時に交換も行っていました。が、今回はこれを分けてみたいと思います。そして、今回は最小のものを最初に持っていくようにします。
つまり、先ず最小のものを探し、それを最初のものと交換するということになります。次は、それを除いた範囲で最小のものを探し、それを最初から2番目のものと交換します。
図にすると、こんな感じです。
図.1 比較と交換を分離したソートアルゴリズム |
---|
こうすると、交換の回数がぐっと減ります。交換はなかなかに時間のかかりそうな処理なので、それが減るのは心強いですね。
このように、最小のものを最初に持っていくようなソート法を、選択法と呼びます。
では、プログラムを作ってみましょう。
プログラム |
---|
// Sort2.cpp #include "SortData.h" #include "SortSub.h" // 選択法 void SelectSort(int* pnData, int nNumOf) { int iLoop; // (データの個数−1)回回すための変数 int iSearch; // 一番小さいのを探すときのループ変数 int iMin; // 一番小さいデータのインデックス int nMin; // 現在の最小データ // (データの個数−1)回回す for(iLoop = 0; iLoop < nNumOf - 1; iLoop++) { // 初期値の代入 iMin = iLoop; nMin = pnData[iLoop]; // 一番小さいデータを探す for(iSearch = iLoop + 1; iSearch < nNumOf; iSearch++) { // より小さいデータがあると、iMin と nMin を更新する if(pnData[iSearch] < nMin) { iMin = iSearch; nMin = pnData[iSearch]; } } // データの移動 Swap(pnData[iMin], pnData[iLoop]); } } int main() { SelectSort(g_anData, g_nNumOf); DispArray(g_anData, g_nNumOf); return 0; } |
実行結果 |
1, 1, 4, 6, 9, 9, 10, 11, 13, 14, 15, 16, 23, 25, 28, 29, 31, 33, 34, 39, 39, 40, 40, 41, 42, 44, 48, 51, 51, 53, 54, 55, 56, 63, 67, 68, 73, 73, 76, 77, 78, 79, 79, 87, 89, 99, 99, 101, 101, 103, 110, 112, 116, 117, 117, 118, 124, 128, 136, 137, 137, 138, 148, 150, 152, 155, 157, 160, 161, 164, 166, 167, 168, 169, 173, 173, 174, 175, 185, 186, 188, 192, 199, 203, 213, 215, 222, 228, 228, 229, 231, 235, 239, 240, 240, 242, 249, 249, 254, 255, |
はい、きちんとソートできましたね。
交換の回数が少ない分、選択法はバブルソートよりも高速です。選択法も作るのは簡単なので、自作するときは選択法を使った方がいいかもしれませんね。
では、今回の要点です。
それでは次回まで。
Last update was done on 2000.9.13
この講座の著作権はロベールが保有しています