求C语言线性时间选择
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求C语言线性时间选择相关的知识,希望对你有一定的参考价值。
代码如下;这是别人的、有几点看不太懂、所以想请教下:
#include <stdio.h>
#define N 1000
int num[N];
void qsort(int *a,int x,int y)
int xx=x,yy=y;
int k=a[x];
if(x>=y)
return;
while(xx!=yy)
while(xx<yy && a[yy]>=k)
yy--;
a[xx]=a[yy];
while(xx<yy && a[xx]<=k)
xx++;
a[yy]=a[xx];
a[xx]=k;
qsort(a,x,xx-1);
qsort(a,xx+1,y);
void swap(int a,int b)
int c;
c=num[a];
num[a]=num[b];
num[b]=c;
int mid(int a)
int b[5];
int i;
for(i=0;i<5;++i)
b[i]=num[a+i];
qsort(b,0,4);
for(i=0;i<5;++i)
if(b[2]==num[a+i])
return (a+i);
int partition(int p,int r,int x)
int i=p,j=r+1;
while(true)
while(num[++i]<x);
while(num[--j]>x);
if(i>=j) break;
swap(i,j);
num[p]=num[j];//必须是j不能是i
num[j]=x;
return j;
int select(int p,int r,int k)//选择p到r间的第k小元素
if(r-p<75)
qsort(num,p,r);
return num[p+k-1];
int n=r-p+1;
int i,j;
for(i=0;i<=(n-5)/5;++i)
j=mid(p+5*i);
swap(p+i,j);
int x=select(p,p+(n-5)/5,(n-5)/10);
i=partition(p,r,x);
j=i-p+1;
int m,count;
m=0;
for(count=p;count<=r;++count)
if(num[count]==x)
++m;
if(m>=1 && j<=k && k<=j+m-1)
return num[i];
else if(k<=j) return select(p,i,k);
else return select(i+1+m,r,k-j-m);
int main()
int i,j,k;
while(true)
i=0;
printf("please putin num[]:\n");
while(scanf("%d",&num[i]),num[i])++i;
printf("please putin k:\n");
scanf("%d",&k);
j=select(0,i-1,k);
printf("the Kth element is: %d\n",j);
return 0;
这里 for(i=0;i<=(n-5)/5;++i),为什么i<=(n-5)/5,直接n-5不就可以了?
还有这里int x=select(p,p+(n-5)/5,(n-5)/10);这个x是做什么的?为什么要p+(n-5)/5
最后这里for(count=p;count<=r;++count)
if(num[count]==x)
++m;
if(m>=1 && j<=k && k<=j+m-1)
return num[i];
else if(k<=j) return select(p,i,k);
else return select(i+1+m,r,k-j-m);
for(count=p;count<=r;++count)
if(num[count]==x)
++m;
if(m>=1 && j<=k && k<=j+m-1)
return num[i];
else if(k<=j) return select(p,i,k);
else return select(i+1+m,r,k-j-m);
能否帮忙解析下这几句?
线性时间选择说,假设所有元素互不相同,则利用这种方法选择出来的基准x,至少有3*(n-5)/10(即2*(n-5)/5+1/2*(n-5)/5)个元素小于x,同理,也至少有3*(n-5)/10个元素大于x,我想知道的是、这个3*(n-5)/10小于x是如何求出来的?跪求大神指点
以上是关于求C语言线性时间选择的主要内容,如果未能解决你的问题,请参考以下文章