冒泡排序中所需的交换次数,而无需实际对其进行排序

number of swaps required in bubble sort without actually sorting it

本文关键字:排序 交换 冒泡排序      更新时间:2023-10-16

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

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

一个小的代码片段会很好,因为我在这方面不是那么好。

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

独立于实际执行掉期来计算掉期数量是不可行的。

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

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

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