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

xiaomubiao 2004-04-30 12:15:06
给定线形序列集中n个元素和一个整数k,1≤k≤n,输出这n个元素中第k小元素的值及其位置。;
...全文
458 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
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

33,027

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧