给出一个整数数组,第九十百分位数是超过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;
}