快速选择不适用于所有索引

时间:2014-12-15 03:57:26

标签: algorithm sorting data-structures quickselect

我正在尝试使用以下链接中给出的算法实现快速选择 http://www.cs.yale.edu/homes/aspnes/pinewiki/QuickSelect.html

但该程序崩溃了许多k值,并且仅适用于少数几个。请指导我在哪里做错了。

#include <stdio.h>
#include <stdlib.h>

int a1[10];
int a2[10];

int quickselect(int a[], int k,int len){
        int r = rand()%(len-1);

        int pivot = a[r];
        int i =0;
        int len1=0,len2=0;
        for(i=0 ;i<len;i++){
        if(a[i]<pivot)
            a1[len1++]=a[i];
        else if(a[i]>pivot)
            a2[len2++] = a[i];
        else
            continue;
    }

    if(k<=len1)
        return quickselect(a1, k,len1);
    else if (k > len-len2)
        return quickselect(a2, k - (len-len2),len2);

    return pivot;

}
int main()
{
  int a[7] = {8,3,2,6,1,9,5};
  int val = quickselect(a,3,7);
  printf("%d \n",val);

  return 0;
}

1 个答案:

答案 0 :(得分:1)

我测试了你的代码。我认为您应该将int r = rand()%(len-1)更改为int r = rand()%len,因为当len==1您将获得浮点异常时。