0

バブルソートを使用して、配列内の数値を低いものから高いものの順に並べ替えています。同じ数字もありますが、2回印刷する必要はありません。では、それがすでに印刷されているかどうかを確認し、アクションを繰り返さないようにするにはどうすればよいですか?

バブルソート:

for(int i=0;i<n-1;i++){
        for(int j=i+1;j<n;j++){

            if(m[i]>m[j]){
                temp=m[i];
                m[i]=m[j];
                m[j]=temp;
            }
        }
    }
4

3 に答える 3

5

番号は印刷時にすでにソートされているため、最後に印刷された番号を保存して、印刷前にこれと比較することができます。

何かのようなもの:

std::cout << m[0] << std::endl;
int last_print = m[0];

for(int i = 1; i < n; ++i)
{
  if(m[i] != last_print)
  {
    std::cout << m[i] << std::endl;
    last_print = m[i];
  }
}
于 2012-05-23T10:58:40.143 に答える
4

印刷時に重複を除外します (m が int[] であると仮定)

 int last = 0;
 for(int i=0;i<n;i++){
    int num = m[i];
    if (i == 0 || last != num) {
       // print num;
    }
    last = num;
 }

または、あまりにも多くの変数が気に入らない場合は、このようにします

 for(int i=0;i<n;i++){
    if (i == 0 || m[i - 1] != [i]) {
       // print m[i];
    }
 }

または、ソート時に重複を削除することもできます

for(int i=0;i<n-1;i++){
    for(int j=i+1;j<n;){

        if (m[i]==m[j]) {  // remove
           m [j] = m [n - 1];  // replace with last
           n --;               // cut last
        } else {
          if(m[i]>m[j]){
            temp=m[i];
            m[i]=m[j];
            m[j]=temp;
          }
          j ++;
        }
    }
}
于 2012-05-23T11:00:13.577 に答える
2

印刷したらすぐに番号をに追加し、std::set印刷する前にすべての番号がセットに含まれているかどうかを確認できます。

編集:私は番号がソートされるという制限を逃しました。その場合、asetは、最後に印刷された番号を追跡し、後でそれとは異なる番号のみを印刷するよりも、やり過ぎで効率が悪くなります。

于 2012-05-23T10:55:48.923 に答える