【问题标题】:number of swaps required in bubble sort without actually sorting it [duplicate]冒泡排序中所需的交换次数而不实际排序[重复]
【发布时间】:2018-09-13 14:11:57
【问题描述】:

如果有办法在冒泡排序算法中实际找到数组所需的交换次数,我只是在徘徊。我知道你们中的一些人可能会认为实际上使用冒泡排序对数组进行排序并在我们交换时增加计数有什么害处。但我认为为什么会不必要地增加程序的复杂性,因为我只需要对数组进行排序所需的交换次数。 我需要降低以下代码的复杂度。

void minimumBribes(vector<int> q) {
    int count=0;
    //returns Too chaotic if the element is farther then two positions to the left.
    for(int i=0;i<q.size();i++){
        if(q[i]-(i+1)>2){
            cout<<"Too chaotic"<<endl;
            return;
        }
    }
    //counts the number of swaps required
    for(int i=0;i<q.size();i++){
        for(int j=0;j<q.size()-i-1;j++){
            if(q[j]>q[j+1]){
                swap(q[j],q[j+1]);
                count++;
            }
        }
    }
    cout<<count<<endl;

}

一个小代码 sn-p 会很好,因为我在这方面做得不是很好。

【问题讨论】:

  • 我看不出你会怎么做。每次交换都会影响以后的比较,因此您不能只进行“试运行”并得出正确数量的交换。
  • 考虑到您只将冒泡排序用于学术练习,我并没有真正看到“降低复杂性”的论点
  • 实际上我需要降低挑战的复杂性,我认为这样做的唯一方法是这样做,或者我发布代码并直接要求降低代码的复杂性
  • 没有不必要的复杂性增加。计算所需交换的数量与实际进行交换的复杂性相同。也许你误解了“复杂性”的含义,它不一定等同于效率
  • 或者更好的是,复制 O(n) 的数组并在进行 O(n^2) 排序时计算交换。与冒泡排序本身的 O(n^2) 相比,复制的 O(n) 成本将微不足道

标签: c++ sorting time-complexity swap


【解决方案1】:

要知道交换的数量应该只需要知道排序元素的最终位置。排序本身可以使用更好的算法完成,因此总成本将是更有效排序的成本。

【讨论】:

  • 你能演示一下吗?
  • 如果我理解正确,问题的关键是确定冒泡排序算法需要执行的交换次数来对数组进行排序。这可能比您的建议要多得多。
  • @FredLarson 我同意
  • 我认为这个答案解释了如何利用排序向量来获得冒泡排序所需的交换数:stackoverflow.com/a/11422184/487892
  • @drescherjm 如果有人可以请发布一个小代码来证明我认为我会更容易获得它。
【解决方案2】:

独立于实际执行这些交换来计算交换次数是不可行的。

计算复杂度通常以Big-O Notation 表示有几个原因,其中一个重要原因是很难提前对排序算法需要执行多少工作进行精确计算。

对有关排序算法速度的指标使用 Big-O 表示法。如果您想要精确测量,请向其提供一些类似于您希望在应用程序中看到的输入的示例输入,并跟踪对输入进行完全排序所需的交换数量。

【讨论】:

    【解决方案3】:

    正如 user463035818 在 cmets 中指出的那样,计算所需交换的数量与实际进行交换的复杂性相同,即您正在尝试解决您没有的问题。如果您正在寻找效率,那么您可以为冒泡排序做更多的事情。我唯一能想到的进一步优化是添加一个标志,指示是否发生了交换。如果单次内循环没有发生交换,则排序完成,您可以在到达结束之前退出外循环。请注意,如果仍需要执行所有通过(最坏的情况),那么此解决方案的性能会比您原来的解决方案稍差。但是,对于已经排序的向量的最佳情况,它应该以 O(n) 运行。

    int bubbleSortSwaps(std::vector<int> q)
    {
        int count=0;
        for(size_t i=0; i<q.size(); i++)
        {
            bool swapped = false;
            for (size_t j=0; j<q.size()-i-1; j++)
            {
                if(q[j]>q[j+1])
                {
                    swapped = true;
                    std::swap(q[j],q[j+1]);
                    count++;
                }
            }
            if (!swapped) // if no swap happened, it's sorted
            {
                break;
            }
        }
        return count;
    }
    

    【讨论】:

      猜你喜欢
      • 2016-04-04
      • 1970-01-01
      • 2012-07-05
      • 2012-07-05
      • 1970-01-01
      • 1970-01-01
      • 2018-01-01
      • 1970-01-01
      相关资源
      最近更新 更多