- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
那么,嗯,我正在尝试学习快速排序并已为其实现了以下代码。但是,当我将最左边或最右边的元素作为枢轴时,它似乎在 O(n^2) 而不是 O(nlogn) 中运行......
我无法弄清楚我的代码有什么问题,但我很可能犯了一些非常基本的愚蠢错误;谁能帮我解释我哪里出错了?
提前致谢!这是我的代码:
#include <iostream>
#include <vector>
typedef int64_t int64;
int64 numberOfComparisons;
using namespace std;
int partitionAroundPivot(vector<int64>& a, int l, int r) {
numberOfComparisons = numberOfComparisons + (r - l) - 1 ;
int ppos;
ppos = l;
int64 p = a[ppos]; //Gives pivot
if(ppos != l)
swap(a[ppos], a[l]);
int i = l + 1, j;
for(j = l + 1; j <= r; j++){
if(a[j] < p)
{
swap(a[j], a[i]); //Swap with leftmost element bigger than pivot, i.e. v[i]
i++;
}
}
//Now pivot needs to go to its proper place
swap(a[l], a[i - 1]);
return ppos; //WRONG, will return l always, need to return i-1
}
void quickSort(vector<int64>& a, int l, int r) //Inplace so no return stuff
{
if( r - l <= 0)
return ;
int pivotPosition = partitionAroundPivot(a, l, r);
cout << "Called Qsort with positions l " <<l << " r " << r << " Pivot pos " << pivotPosition << endl;
for (int i = l; i < r; i++)
cout << a[i] <<" " ;
cout << endl;
quickSort(a, l , pivotPosition - 1 );
quickSort(a, pivotPosition + 1 , r );
}
int main() {
vector<int64> x = {3, 2, 1, 8, 6, 7, 6, 4};
quickSort(x, 0, x.size() -1);
return 0;
}
部分输出如下:
Called Qsort with positions l 0 r 9 Pivot pos 0
1 2 3 4 6 10 9 5 7
Pivot: 2
Called Qsort with positions l 1 r 9 Pivot pos 1
2 3 4 6 10 9 5 7
Pivot: 3
编辑:我问这个的部分原因是因为我应该计算理论上完成的总比较次数,我只是使用(每个分区调用的子数组大小 - 1)作为值(实际的会有所不同,我知道因为只有部分比较实际上发生了)。这可以在上面的 numberOfComparisons 变量中看到。
现在的问题是,为了对 100 个数字进行排序,全部从 1 到 100,没有唯一的并且大部分是随机的,它显示计算次数为 4851,接近 100*99/2 又名 n*(n-1)/2 其中 n = 100。这让我相信它正在执行 O(n^2) 时间。这是正确的...?
EDIT2:毕竟我太蠢了。 partitionAroundPivot 总是返回子数组的第一个位置,导致其中一个拆分为零长度子数组,另一个拆分为数组的其余部分。我需要传回a[l]实际去的位置而不是l; i-1 在这种情况下。吸取教训,我想。
非常感谢你们的帮助,伙计们!
最佳答案
Qucksort 的复杂度为 O(n log n),但平均而言,最坏情况下为 O(n^2),最佳情况下为 O(nlogn)。获得良好效率的最重要方面是选择一个好的支点。
在您的程序中,您选择了最差的主元之一,因为如果您选择第一个或最后一个,在有序(或反向排序) vector 的情况下,您的算法在最坏情况下效率最高。
这就是为什么您必须考虑您的算法来选择枢轴的原因。最常用的方法之一是选择三个元素的中位数,例如第一个、中间和最后一个元素。因此,应用于有序 vector 的算法是 O(nlogn)。
更新:复杂性取决于增长情况,而不是具体情况。事实上,对于特定大小的问题,您可能具有非常高的值,而当问题大小变得非常大时,配置文件的增加会更加平稳。在检查任何东西之前,使用达到非常大 n 的几个单独值运行程序。
关于c++ - 快速排序显然是选择o(n^2)当左或最右元素作为枢轴时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38438083/
我有一个与这个非常相似的问题: How to pivot a MySQL entity-attribute-value schema 或者这个 Enumerating combinations via
我在 postgresql-11 中使用 crosstab() 时遇到问题。 这是我的 table , CREATE TABLE monitor(tz timestamptz, level int,
我目前正在使用 ViewPropertyAnimators 来缩放 ImageView。然而,问题是图像总是从中心向外缩放,当我希望它从最左边缩放并向右缩放时。似乎没有枢轴方法。我还有其他方法可以做到
问题 1:我有一个具有以下结构和数据的表: app_id transaction_id mobile_no node_id customer_attribute entered_value
import numpy as np import pandas as pd data = {'experiment_name': ['exp1', 'exp1', 'exp1', 'exp1', '
我正在构建一个包含多个跟踪器的系统,这些跟踪器将使用许多相同的列,因此当用户插入跟踪器时,有一个用于跟踪器的表、跟踪器列,然后是哪些列与哪个跟踪器搭配的交叉引用row 不同的列值存储在共享相同记录 I
我有一个数据帧,其中有几个变量(此处为 Var1 和 Var2),这些变量在不同位置(此处为 Station)是不同的。然后我有一定数量的案例,对于每个案例,我在每个位置都会得到不同的值。 例如: n
我们正在开发 C# 应用程序,我们一直在使用 Linq to SQL 或标准 ADO(当需要性能时)与 SQL Server 一起工作。 我们有一个这样布置的表: 客户 ID、年/月、产品名称、数量
如何在 UWP 上创建一个枢轴,如果选中标题选项卡上的按钮,它将导航到其他页面?以及如何在标题选项卡上使用图像?例如在下图中,如果选择选项卡标题“Store”,它将导航到“Store”页面。 我试过搜
开始了解它的所谓的枢轴,但无法在没有聚合的情况下获得 sqlite 的示例。 架构: Readonly Table foos(_id, foo) (10 max records) Readonly T
我在 postgres 中有一个表(这是查询的结果),它有一组行(复杂的数据求和的结果),如下所示:(列名是每一天的名称, 每列的值都是 double 。) 周日周一周二周三周四周五 1.24 1.1
我已经学习和练习 sql 大约 6 个月了。我已经准备好投入其中,只是承认我对此很愚蠢,而且我的大脑无法理解它的大部分模式。我正在尝试创建一个数据透视表。关于这个主题的简单文献并不多,我找到的一个来源
我有一些模仿以下结构的数据: rdd = sc.parallelize( [ (0,1), (0,5), (0,3), (1,2
我有一个如下所示的数据框: id Revenue Cost qty time 0 A 400 50 2 1 1 A
我正在使用 Laravel 4 构建应用程序,但偶然发现了数据透视表的问题。 我有一个用户模型、一个建立模型和一个 StudyLevel 模型。 目前,为了找到用户所在的位置,我在用户模型中使用了以下
https://databricks.com/blog/2016/02/09/reshaping-data-with-pivot-in-apache-spark.html很好地解释了一个枢轴如何为 S
我正在尝试使用 Python 为一些时间序列建模准备数据Pandas (第一个计时器)。我的 DataFrame看起来像这样: df = pd.DataFrame({ 'time': [0,
我想转换以下 Pandas 数据框 a b 0 1 2 1 1 5 2 2 4 3 1 3 4 3 7 5 2 1 到 0 1
我要获取相对于 DisplayObject 的 anchor 例子: // HOW GET THIS VALUES IN CODE Object height = 90px Objec
所以我有这个 DF: In [130]: dfAbr Out[130]: ip ospfArea router_name 0 1.1.1.1 0.0.0.2 Rou
我是一名优秀的程序员,十分优秀!