【问题标题】:C++ Bubble Sort, how to ignore the same numbersC ++冒泡排序,如何忽略相同的数字
【发布时间】:2012-05-23 10:54:21
【问题描述】:

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

冒泡排序:

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;
            }
        }
    }

【问题讨论】:

  • 你什么时候打印?排序前/中/后?
  • 不是真的,我正在准备明年的考试,所以我只是在努力做去年的考试

标签: c++ algorithm sorting bubble-sort


【解决方案1】:

由于数字在打印时已经排序,您可以存储最后打印的数字并在打印前与此进行比较。

类似:

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];
  }
}

【讨论】:

  • 该死,为什么我没有想到 xD if(m[i]!=m[i-1]) 就像一个魅力。感谢您的建议。
  • 此代码不起作用。您定义了 last_print 两次。删除 int
  • @stefanbachert,这是睡眠不足的灵魂复制粘贴错误:-)。感谢史蒂夫编辑。
【解决方案2】:

打印时过滤掉重复项(假设 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 ++;
        }
    }
}

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 一个简单的例子将不胜感激:)
    • @RnD 最好自己研究一下std::set 的功能。如果您遇到困难,我很乐意提供帮助,但我不会为您编写代码。
    • @Nikko 我错过了数字排序的部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-17
    • 1970-01-01
    • 1970-01-01
    • 2014-03-26
    • 2018-11-13
    • 1970-01-01
    • 2016-12-02
    相关资源
    最近更新 更多