如何使用快速选择来查找第k百分位数

时间:2015-12-11 07:11:17

标签: c algorithm quicksort percentile quickselect

给出一个整数数组,第九十百分位数是超过90%数组的第一个数字。如果您想要更具体的定义,请查看http://studentnet.cs.manchester.ac.uk/ugt/COMP26120/lab/ex6def.html

我写了一个快速选择程序,可以在正常情况下成功运行。这是部分排序,只排序第90百分位所包含的一侧。

但是对于特殊场合,如果所有整数都相同,并且没有第90个百分点,它仍会找到第90个数字,但不会返回-1。

请在纠正后确保程序为O(n)。

如果我在main函数中使用了一个循环,它重复调用快速选择函数来比较(第k-1)个数和第k个数,运行时间将为(nk)* n = O(n ^ 2)(快速选择)在我用谷歌搜索的O(n)中。选择时找到有效的第90个数字是否更容易?

Here are my codes:
#include <stdio.h>
#include <math.h>
#include <stdlib.h>  
#define N 23

void swap ( int *a, int *b){
    int t;
    t=*a;
    *a=*b;
    *b=t;
}
int partition(int *a, int high){ //high is the last index of this array
    int i,j,pivotValue;
    i = -1;
    j = 0;
    pivotValue = a[high]; 
    for ( j=0; j<high; j++){
        if ( a[j]> pivotValue){
            continue;
        }
        i++;
        swap(&a[i], &a[j]);
    }
    return i+1;
}
int quickSelect(int a[],int n, int k) { //n is the size of the array
    int pivotIndex;
    pivotIndex = partition(a, n-1);
    if ( pivotIndex >= k ){//left.size = pivotIndex
        printf("left\n");

        return quickSelect(a, pivotIndex, k);
    }
    else if ( (pivotIndex+1)==k ){
        printf("pivot\n");
        return a[n-1];
    }
    else{
        printf("right\n");
        return quickSelect(&a[pivotIndex], n-(pivotIndex+1), k-(pivotIndex+1));
    }
}


int main()
{
int a[] = {1612,1894,3018,4212,6046,12894,13379,14408,14615,16394,17982,23004,27588,31393,33195,39526,54326,54566,60000,60000,60000,60000,703908};

    int find,k;

    k = floor(N*0.9)+1;
    printf("k=%d\n",k);

    find = quickSelect(a, N, k);

    printf("the 90th number=%d\n",find);

    return 0;
}

0 个答案:

没有答案