当前位置: 首页 > 知识库问答 >
问题:

结合QuickSort和中位数选择算法

楚泳
2023-03-14

我想修改QuickSort(在Java中),这样每次调用Partition时,都会以比例数组的中值作为支点。

我在Java中有一个中值选择算法,它返回第k个最小的元素,在本例中是中值。我有大量的java快速排序算法,它们都可以独立工作,对数组进行排序。不幸的是,我不能结合这两者来实现上述目标...每次我尝试它,我通常得到堆栈溢出错误。

任何人都可以向我展示代码,看看它是如何完成的吗?

谢谢

编辑:例如,这是一个我曾经尝试使用的中值选择算法。

public int quickSelect(int[] A, int p, int r, int k) {
    if (p==r) return A[p];
    int q = Partition(A,p,r);
    int len = q-p+1;

    if (k == len) return A[q];
    else if (k<len) return Select(A,p,q-1,k);
    else return Select(A,q+1,r,k-len);
}

public int partition(int[]A, int p, int r) {
    int x = A[r];
    int i = p-1;
    for (int j = p; j<=r-1; j++) {
        if (A[j] <= x) {
            i++;
            swap(A,i,j);
        }
    }
    swap(A,i+1,r);
    return i+1;
}

它本身可以工作,但是当我尝试通过快速排序的分区函数调用快速选择以返回要使用的支点时,它不起作用。显然我做错了什么,但我不知道是什么。不幸的是,在Internet上,我没有找到任何算法,即使是伪代码,可以将中值选择与快速排序结合起来。

共有3个答案

颜哲彦
2023-03-14

请注意,在< code>PARTITION中,< code>pivot是< code>A[r]。

public int QUICKSORT2(int[] A, int p, int r) {
    if (p<r) {
        int median=Math.floor((p + r) /2) - p + 1
        int q=SELECT(A, p, r, median)
        q=PARTITION2(A, p, r, q)
        QUICKSORT2(A, p, q-1)
        QUICKSORT2(A, q+1, r)
    }
}

public int PARTITION2(int[]A, int p, int r, int q) {
    int temp = A[r];
    A[r]=A[q];
    A[q]=temp;
    return PARTITION(A, p, r)
}
汪建白
2023-03-14

您正在寻找的是选择算法。这是一个带有伪代码的链接。

从链接:

在计算机科学中,选择算法是寻找列表中第k个最小数字的算法

要找到中值,您需要找到列表中k = floor((n-1)/2)最小的数字,其中n是列表的大小。

归鹤龄
2023-03-14

获取中位数的标准方法是对数据进行排序。你想通过对中位数进行分区来对数据进行排序。这对我来说似乎是鸡和蛋。

你能详细说说为什么你想对中位数进行分区/透视吗?

 类似资料:
  • 这是我的quicksort算法,包括分区和交换。当我选择数组的最后一个元素(在函数quicksort中:)作为数据透视时工作良好,但当取第一个元素时失败:

  • 我已经理解了quicksort算法中的分区部分是如何完成的,但是我在理解quicksort递归函数时遇到了麻烦。谁能一步一步地给我解释一下它是怎么工作的吗?这里粘贴的是C++代码。 我的逻辑到目前为止(一步一步)是这样的:

  • 我有两个针对同一个表的select查询,这两个查询在select部分中都只包含一个< code>sum(),但是在< code>where子句中有所不同。我需要做的是对两个查询的结果求和。 查询示例: 我需要的是像这样的东西 其中选择和,如我的示例查询中所示。 我试着回答这个问题,但没能成功。我还尝试用替换字段,但这不起作用,因为不允许在中使用

  • 我的MongoDB数据库有一个结构 每个a文档都有一个带有bool值vield“result”。我进行聚合选择: 并得到一个结果: 如何计算字段“result”中值“true”和“false”的数量,并得到如下结果:

  • 问题内容: 如何将伪元素选择器()与属性选择器()组合在一起? 我尝试使用,但这在Chrome中不起作用。 HTML: CSS: 在每个div的末尾显示“ YES”,第二个div之后应显示“ NO”。 我正在运行Chrome 17.0.963.38。在Safari 5.1.2中似乎可以正常工作。 问题答案: 这看起来像个错误,终于被报道了。如果您为样式表中的任何位置 添加CSS规则并至少包含一个声

  • 本文向大家介绍Android中ListView结合CheckBox实现数据批量选择(全选、反选、全不选),包括了Android中ListView结合CheckBox实现数据批量选择(全选、反选、全不选)的使用技巧和注意事项,需要的朋友参考一下 APP的开发中,会常遇到这样的需求:批量取消(删除)List中的数据。这就要求ListVIew支持批量选择、全选、单选等等功能,做一个比较强大的ListVi