2

私は少し練習していて、バブルソートアルゴリズムで配列をソートしようとしました。コンパイラは私に警告もエラーも与えませんでした、そしてそれはうまくいきました!最初に10倍の数値を入力し、次にプログラムがそれらをソートして印刷します。

コード:

#include <iostream>
using namespace std;

void arr_sort(int* array, const int arr_size){

int temp = 0;   //Temporary integer to store (if necessary) the current element
int end = 0;    //Run time condition

while(end++ != arr_size){ // Will loop max. 10 times

    for(int i = 0; i < arr_size; i++){

        if(array[i] > array[i + 1]){    //If the current element 
            temp = array[i];    //is bigger than the next

            array[i] = array[i + 1];//Change the positions
            array[i + 1] = temp;    
        }
    }
}

}

int main(){

int arr_input[10];

for(int i = 0; i < 10;i++)      //The user has to type 10 numbers
    cin >> arr_input[i];        //which will be stored in this array

arr_sort(arr_input, 10);        //sorts the array

cout << endl << endl;

for(int i = 0; i < 10; i++)     //Print out the array!
    cout << arr_input[i] << ", ";
cout << endl;

return 0;
}

私の唯一の問題は、arr_sort関数のwhileループです。つまり、 endがarr_sizeと同じ値になるまで配列をソートします。しかし、多くの場合、それほど長くは必要ありません。今の私の質問...どうすればこの機能を改善できますか?配列が完全にソートされているかどうかをテストして、whileループを何度も実行せずに停止できるようにするにはどうすればよいですか...?

4

2 に答える 2

6

forループの前に、それがソートされていると仮定します。

bool sorted = true;

ifステートメント`で、ソートされていないことを記録します。

sorted = false;

ループの後で、forソートされていないという証拠がなかった場合は戻ります。

if ( sorted ) return;
于 2013-03-20T15:07:40.727 に答える
3

forループのすぐ外側で、boolを配置し、falseに設定します。スワップブロック内で、boolをtrueに設定します。forループの後、ブール値を確認します。それでもfalseの場合は、スワップが行われず、配列が並べ替えられるため、whileループから抜け出します。

while(end++ != arr_size){ // Will loop max. 10 times

    bool swapped = false;
    for(int i = 0; i < arr_size; i++){

        if(array[i] > array[i + 1]){    //If the current element 
            temp = array[i];    //is bigger than the next

            array[i] = array[i + 1];//Change the positions
            array[i + 1] = temp;
            swapped = true;    
        }
    }
    if (!swapped) break;
}
于 2013-03-20T15:06:48.010 に答える