【问题标题】:quickselect algorithm快速选择算法
【发布时间】:2012-03-14 07:17:44
【问题描述】:

当我运行以下代码进行快速选择时

#include <cstdlib>
#include <iostream>

using namespace std;
const int n = 15;
int b[100];
int btotal=0;
int c[100];
int ctotal=0;

void read(int a[],int size){
    for (int i=1; i<=15; i++) cin >> a[i];
}

int quickselect(int a[], int k)
{
    int r = 1 + rand()%(n-1);
    int pivot = a[r];
    for (int i=1; i<=n; i++) {
        if (a[i] < pivot) {
            b[i] = a[i];
            ++btotal;
        }

        if (a[i] > pivot) {
            c[i] = a[i];
            ++ctotal;
        }  
    }

    if (k <= btotal) quickselect(b,k);
    if (k > (n-ctotal)) return quickselect(c, k - (n-ctotal));        

    return pivot;          
}

int main(int argc, char *argv[])
{
    int a[n];
    cout <<" enter contents of array " << endl;
    read(a, n);
    quickselect(a, 6);
    //system("PAUSE");
    //return EXIT_SUCCESS;
    return 0;
}

1 4 2 3 5 7 6 9 8 10 13 12 11 15 14

我有运行时错误,我认为这是与索引有关的问题,但找不到哪里,请帮助我

【问题讨论】:

  • 我猜你的意思是“快速排序”?
  • 没有没有快速选择,但我猜到这段代码的主要问题
  • 提示一下,在为快速排序选择枢轴值时,最好选择三的中位数。这将使算法很可能选择一个好的枢轴值。如果您选择一个随机元素,并且该元素恰好是最低或最高值,则算法将非常慢。如果我发现代码有什么问题,我会回复你
  • 我不知道使用代码,如何找到三个的中位数

标签: c++ median


【解决方案1】:

您在数组a 的范围之外写入。

int a[15] 将为 15 个整数分配空间,索引范围从 a[0]a[14]。您当前正在读/写以将[1] 偏移到(包括)[15],这是错误的。


最少的改动

void
read (int a[],int size)
{
  for (int i=0; i < 15; i++) // CHANGE TO
    ...
}

...

int
quickselect(int a[],int  k)
{
  ...

  for (int i=0; i < n; i++) { // CHANGE TO

  ...
}

【讨论】:

  • 是的@refp 非常感谢,我可以使用 1 个索引数组,但我想一件事,当我调用递归快速选择时,我不会覆盖已经存在的数组吗?我的意思是c和b
  • @dato 不要忘记将答案标记为已接受,以帮助未来的读者查看问题是否已解决。关于您关于“覆盖已存在的数组”的问题,这是一个更好地在新线程中讨论的主题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-07
  • 1970-01-01
  • 2020-07-01
  • 1970-01-01
  • 2012-05-23
  • 1970-01-01
相关资源
最近更新 更多