冒泡排序中所需的交换次数,而无需实际对其进行排序
number of swaps required in bubble sort without actually sorting it
我只是在徘徊,如果有一种方法可以实际找到气泡排序算法中数组所需的交换次数。我知道你们中的一些人可能会认为使用气泡排序实际对数组进行排序并在我们交换时增加计数有什么害处。但是我认为为什么要不必要地增加程序的复杂性,因为我只需要对数组进行排序所需的交换次数。 我需要降低以下代码的复杂性。
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;
}
相关文章:
- shell排序中的交换和比较
- 排序时无法执行交换操作.我做的时候它会崩溃.为什么
- 插入排序的最小交换
- 不正确的比较和交换计数器输出用于快速排序功能
- 选择排序时交换函数调用的数量和完成的交换次数是否相同?
- 冒泡排序中所需的交换次数,而无需实际对其进行排序
- 修改的选择排序,选择最大的数字,然后交换到最后
- 为什么此代码上的排序算法不调用类的交换版本?
- 从递归向后选择排序函数调用 max 和交换函数
- 跟踪选择排序中的交换和比较次数
- 快速排序中的交换函数给出错误的输出
- 用于快速排序的最大元素交换次数
- 计数交换/比较合并排序算法的数字
- 每次交换后,如何使用任何排序算法打印到控制台
- 如何在快速排序算法中使已排序数组的交换次数为零
- 排序算法的交换函数不适用于排序函数中的参数。
- STL 中的排序方法不能交换向量中的内容
- 排序链表-移动节点还是交换数据成员
- 在c++中使用冒泡排序/交换对字符串进行排序
- 在不进行冒泡排序的情况下,计算数组中冒泡排序交换的次数