0

我正在使用冒泡排序对数组中的数字按从低到高的顺序进行排序。但是有些数字是相同的,但我不需要将它们打印两次。那么如何检查它是否已经打印而不重复操作呢?

冒泡排序:

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

您可以在打印后立即将号码添加到 astd::set中,并在打印之前检查所有号码是否在集合中。

编辑:我错过了数字排序的限制。在这种情况下, aset与仅跟踪最后打印的数字并仅打印与它不同的数字相比,是多余的并且效率较低。

于 2012-05-23T10:55:48.923 回答