分治法实现元素选择问题!!!

xiaomubiao 2004-04-30 12:15:06
给定线形序列集中n个元素和一个整数k,1≤k≤n,输出这n个元素中第k小元素的值及其位置。;
...全文
381 2 点赞 打赏 收藏 举报
写回复
2 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
aheadyes 2004-04-30
#include<stdlib.h>
#include<time.h>
#include<stdio.h>

#define Swap(a,b) {int t=b; b=a; a=t;}

int partition(int a[],int L, int r)
{
int i = L-1,j=r;
int v = a[r];
while(1)
{
while(a[++i] < v);
while(v < a[--j]) if(j==L) break;
if(i>=j) break;
Swap(a[i],a[j]);
}
Swap(a[i],a[r]);
return i;
}

int RandomPartition( int a[], int l, int r)
{
srand(time(0));
int i = rand()%(r-l+1)+l;//随机划分:
Swap(a[i],a[r]);
return partition(a,l,r);
}

int RandomSelect(int a[], int l, int r, int k)
{
if(r<=l) return a[r];
int i= RandomPartition(a,l,r);
int j = i-l+1;
if(j == k)
return a[i];
if(j>k)
return RandomSelect(a,l,i-1,k);
else
return RandomSelect(a,i+1,r,k-j);

}

void disp(int a[],int n)
{
for(int i=0; i<n; i++)
printf("%d ", a[i]);
}

int main()
{
int a[]={1,12,3,-4,81,16,100,17};
disp(a,8);
int k;
printf("\nplease input the k:");
scanf("%d",&k);
printf("\n the %d's Big Number is : %d ",k,RandomSelect(a,0,7,k));

system("pause");

}
  • 打赏
  • 举报
回复
BlueSky2008 2004-04-30
http://expert.csdn.net/Expert/topic/2642/2642994.xml?temp=.6752436
  • 打赏
  • 举报
回复
相关推荐
发帖
数据结构与算法
加入

3.2w+

社区成员

数据结构与算法相关内容讨论专区
申请成为版主
帖子事件
创建了帖子
2004-04-30 12:15
社区公告
暂无公告