我只是在徘徊,是否有一种方法可以真正找到气泡排序算法中数组所需的交换次数。我知道有些人可能会认为,每次交换时,使用冒泡排序对数组进行实际排序并增加计数的危害是什么?但是我想的是为什么不必要地增加程序的复杂性,因为我只需要对数组进行排序所需的交换次数即可。 我需要降低以下代码的复杂性。
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;
}
一个小代码段会很不错,因为我对此并不那么好。
答案 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;
}