利用分治策略,在n个不同元素中找出第k个最小元素。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用分治策略,在n个不同元素中找出第k个最小元素。相关的知识,希望对你有一定的参考价值。
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
typedef int datatype;
typedef struct
datatype data[MAXSIZE];
int last;
SeqList;
SeqList *CreatSeqList()
SeqList *L;
int temp,i=0;
L=(SeqList *)malloc(sizeof(SeqList));
L->last=-1;
printf("please input the numbers:(End with any character)\n");
while(scanf("%d",&temp))
L->data[i++]=temp;
--i;
L->last=i;
return L;
datatype part(SeqList *L,int a,int b,int k)
int i,j,count;
datatype m,n,x;
m=L->data[k-1];
for(i=a;i<=b;i++)
if(L->data[i]<m)
n=L->data[i];
for(j=i-1;j>=a;j--)
L->data[j+1]=L->data[j];
L->data[0]=n;
count=0;
if(m!=L->data[
if(count==k-1)
x=L->data[k-1];
return x;
if(count<k-1)
part(L,count+1,b,k);
else
part(L,a,count,k);
main()
SeqList *L;
datatype x;
int k,n;
L=CreatSeqList();
n=L->last;
printf("The total number is %d\n",n+1);
printf("Now you can enter number k(1<=k<=%d):\n",n+1);
scanf("%d",&k);
x=part(L,0,L->last,k);
printf("The %d smallest is %d",k,x);
getch();
求解 程序错误的地方并帮我改正下。谢谢
count=0;
if(m!=L->data[
这边 count 要如何实现
kjhjgkkfpkoku[k'oyiy'pokujjkhg;i'ypo8ity0oi uykl'hlk;lj
fpf'lk'[fyu#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
typedef int datatype;
typedef struct
datatype data[MAXSIZE];
int last;
SeqList;
SeqList *CreatSeqList()
SeqList *L;
int temp,i=0;
L=(SeqList *)malloc(sizeof(SeqList));
L->last=-1;
printf("please input the numbers:(End with any character)\n");
while(scanf("%d",&temp))
L->data[i++]=temp;
--i;
L->last=i;
return L;
datatype part(SeqList *L,int a,int b,int k)
int i,j,count;
datatype m,n,x;
m=L->data[k-1];
for(i=a;i<=b;i++)
if(L->data[i]<m)
n=L->data[i];
for(j=i-1;j>=a;j--)
L->data[j+1]=L->data[j];
L->data[0]=n;
count=0;
if(m!=L->data[
if(count==k-1)
x=L->data[k-1];
return x;
if(count<k-1)
part(L,count+1,b,k);
else
part(L,a,count,k);
main()
SeqList *L;
datatype x;
int k,n;
L=CreatSeqList();
n=L->last;
printf("The total number is %d\n",n+1);
printf("Now you can enter number k(1<=k<=%d):\n",n+1);
scanf("%d",&k);
x=part(L,0,L->last,k);
printf("The %d smallest is %d",k,x);
getch();
参考技术B typedef int datatype;
typedef struct
datatype data[MAXSIZE];
int last;
SeqList;
SeqList *CreatSeqList()
SeqList *L;
int temp,i=0;
L=(SeqList *)malloc(sizeof(SeqList));
L->last=-1;
printf("please input the numbers:(End with any character)\n");
while(scanf("%d",&temp))
L->data[i++]=temp;
--i;
L->last=i;
return L;
datatype part(SeqList *L,int a,int b,int k)
选择问题(分治策略)
选择问题(Selection Problem),即在n个元素的集合中寻找第K小的元素的问题。第K小的元素又叫第K个顺序统计量。有以下几种变体:
- 找最大值和最小值;同时找最大和最小值
- 找中位数(第n/2小)
- 找任意第K小的元素
- 找Top-K的元素
1 //选择问题 2 #include<iostream> 3 #include<cstdio> 4 #include<cstdlib> 5 #include<algorithm> 6 using namespace std; 7 int a[1001]; 8 9 int select(int left,int right,int k){ 10 if( left >= right ) 11 return a[left]; 12 int x = a[left]; 13 int i = left; 14 int j = right+1; 15 while( true ){ 16 do{ 17 i++; 18 }while(a[i]<x); 19 do{ 20 j--; 21 }while(a[j]>x); 22 if( i>=j ) 23 break ; 24 swap(a[i],a[j]); 25 } 26 if( j-left+1 == k ) 27 return x; 28 a[left] = a[j]; 29 a[j] = x; 30 if( j-left+1 < k ) 31 return select(j+1,right,k-j+left-1); 32 else 33 return select(left,j-1,k); 34 } 35 36 int main(){ 37 int n; 38 while( scanf("%d",&n) != EOF ){ 39 int k; 40 cin>>k; 41 for( int i = 0; i < n; i++ ) 42 cin>>a[i]; 43 cout<<select(0,n-1,k)<<endl; 44 } 45 return 0; 46 }
以上是关于利用分治策略,在n个不同元素中找出第k个最小元素。的主要内容,如果未能解决你的问题,请参考以下文章