アルゴリズムⅠ・講義メモ1

・検索とソートのまとめ
※ 7/24は前期ラストで時間内課題作成(フローチャートとプログラム)テーマは「ソート」

ソート:プログラムにしよう(再掲載)

・配列の値は初期化で与えてOK
 例:int[] val = {80,20,10,40,50,60}; //元の1次元配列
・ソート結果の表示を追加すること

int[] val = {80,20,10,40,50,60}; //元の配列
for(int i = 0; i < val.Length - 1; i++) { //カウンタiで要素数-1回繰返す
    for(int j = 0; j < val.Length - 1; j++) { //カウンタjで要素数-1回繰返す 
        if(val[j] > val[j + 1]) { //隣と降順になっていたら
            var temp = val[j]; //退避してから
            val[j] = val[j + 1]; //交換する
            val[j + 1] = temp;
        }
    }
}
foreach (int i in val) { //配列の全要素について繰返す
    Console.WriteLine(i);
}

提出フォロー:ソート:アルゴリズムを改良しよう

・このアルゴリズムでは「すでに整列されている(に近い)」状態からでも同じ時間がかかってしまう。
・それは途中で「もう交換しなくてもよい」状態になっても終わらないから
・よって、フラグを作って、カウントjの繰返し開始前にオフ(交換してない)としておこう
・そして、交換したらフラグをオンにしよう
・で、カウントjの繰返しが終わった時、フラグがオフのままなら出来上がっているのでbreakで抜けよう

作成例

int[] val = {80,20,10,40,50,60}; //元の配列
for(int i = 0; i < val.Length - 1; i++) { //カウンタiで要素数-1回繰返す
    bool f = false; //【追加】交換フラグをオフに
    for(int j = 0; j < val.Length - 1; j++) { //カウンタjで要素数-1回繰返す 
        if(val[j] > val[j + 1]) { //隣と降順になっていたら
            var temp = val[j]; //退避してから
            val[j] = val[j + 1]; //交換する
            val[j + 1] = temp;
            f = true; //【追加】交換フラグをオンに
        }
    }
    if(!f) { //【以下追加】交換フラグがオフ?
        break; //今回1度も交換していない=整列済になっているので終わる
    }
}
foreach (int i in val) { //配列の全要素について繰返す
    Console.WriteLine(i);
}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です