【问题标题】:Iterative bubblesort迭代冒泡排序
【发布时间】:2017-04-23 22:00:26
【问题描述】:

我正在用 C++ 做一些关于排序算法的练习,但其中一个我听不懂。

它说要实现一个函数,给定一个整数数组,应该使用冒泡排序算法(迭代)对它们进行排序,该函数应该在 for 循环没有促进交换时立即终止的元素。这甚至可能吗?

按照我的理解,终止算法的正常条件是排序等于 1。所以,在这个例子中,

void bubblesort( int v[], int size ) {
    for( int i = size; i > 0; --i )
        for( int j = 0; j < i; ++j ) {
            if( v[j] <= v[j+1] ) continue;
            int aux = v[j];
            v[j] = v[j+1];
            v[j+1] = aux;
         }
}

但这并不能解决练习,是吗?

【问题讨论】:

  • 是的,这是可能的,它也在维基百科上的伪代码:en.wikipedia.org/wiki/Bubble_sort#Implementation
  • 这不仅不能解决问题,而且是未定义的行为和错误,因为显示的代码偏移了 1,并且超出了数组的末尾。
  • 如果 v 是一个从 0 开始的数组,最后一个元素是 size-1 而不是 size...所以你的数组从 1 开始到 size

标签: c++ bubble-sort


【解决方案1】:

根据我从您的问题中得到的信息,一旦内部 for 循环不进行任何交换,您就需要终止排序。这可以在bool 的帮助下完成,如下所示:

void bubblesort(int v[], int size)
{
    bool flag;

    for (int i = size; i > 0; --i)
    {
        flag = true;

        for (int j = 0; j < i; ++j)
        {
            if (v[j] <= v[j + 1]) continue;

            flag = false;

            int aux = v[j];
            v[j] = v[j + 1];
            v[j + 1] = aux;
        }

        if (flag) break;
    }
}

解释:如果不满足内部if 条件,则更改flag 的值。如果每次迭代都满足if,则flag 的值不变,在外循环结束时检查。

【讨论】:

    【解决方案2】:

    不,鉴于描述,您的解决方案不能解决任务。
    是的,这是可能的。
    以下代码包含修复它所需的所有更改。

    void bubblesort( int v[], int size ) {  
        boolean change; //create a boolean to track if the current iteration changed anything 
        for( int i = size-1; i >= 0; --i ){  
            change = false; //at the start of each iteration set it to false
            for( int j = 0; j < i; ++j ) {  
                if( v[j] <= v[j+1] ) continue;  
                change = true; // if something changed set it to true  
                int aux = v[j];  
                v[j] = v[j+1];  
                v[j+1] = aux;  
            }  
            if(!change){ // when it's still false at the end of the itteration you are done
                return;
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2014-10-29
      • 1970-01-01
      • 2018-12-16
      • 2015-04-29
      • 2013-04-30
      • 2013-10-09
      • 2015-09-12
      • 1970-01-01
      • 2014-03-26
      相关资源
      最近更新 更多