气泡排序中未实际排序所需交换的数量

时间:2018-09-13 14:11:58

标签: c++ sorting time-complexity swap

我只是在徘徊,是否有一种方法可以真正找到气泡排序算法中数组所需的交换次数。我知道有些人可能会认为,每次交换时,使用冒泡排序对数组进行实际排序并增加计数的危害是什么?但是我想的是为什么不必要地增加程序的复杂性,因为我只需要对数组进行排序所需的交换次数即可。 我需要降低以下代码的复杂性。

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;

}

一个小代码段会很不错,因为我对此并不那么好。

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

有很多原因通常会在.every()method中表示计算复杂性,并且一个重要的原因是这样一个事实,即对于排序算法需要执行多少工作,很难提前进行精确的计算。< / p>

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

答案 2 :(得分:0)

正如用户463035818在评论中指出的那样,计算所需的交换次数与实际进行交换的复杂度相同,即,您正在尝试解决自己没有的问题。如果您正在寻找效率,那么气泡排序就无能为力了。我唯一想进一步优化的就是添加一个标志,该标志指示是否发生了交换。如果通过内循环的一次遍操作没有发生交换,则排序已完成,您可以在到达末尾之前退出外循环。请注意,如果仍然需要执行所有通过操作(最坏的情况),则此解决方案的性能会比原始解决方案差一些。但是,对于已经对向量进行排序的最佳情况,它应该在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;
}