求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是如何求出来的?跪求大神指点

参考技术A 能将函数的功能描述一下吗??? 参考技术B 好久没有做c了,忘了 参考技术C DFEGDE

以上是关于求C语言线性时间选择的主要内容,如果未能解决你的问题,请参考以下文章

用C语言求线性表交集

用c语言编程求线性方程组的解

将C语言循环部分优化,改成线性汇编或者C的都行!~~高手求救

数据结构与算法线性表的重要基本操作与代码实现C语言版

C语言库函数里有线性表基本操作函数吗?

用matlab求向量组的线性相关