首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >快速选择算法

快速选择算法
EN

Stack Overflow用户
提问于 2012-03-14 07:17:44
回答 1查看 3K关注 0票数 1

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

代码语言:javascript
复制
#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

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

EN

回答 1

Stack Overflow用户

发布于 2012-03-14 07:25:44

您是在数组a的边界之外编写的。

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

所需的最小更改

代码语言:javascript
复制
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

  ...
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9697459

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档