利用分治策略,在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 要如何实现

参考技术A m . ,fkms;kjyi;kjs;;lkhj'klfxh;oktyo[okujpklg'hkl'lkm;;mm,nbml/ml;kj;foupify'ljk'l;ghlm,nl;,;lhkf'yufyko
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个最小元素。的主要内容,如果未能解决你的问题,请参考以下文章

分治策略 - 典型实例 - 选择问题

计算机算法设计与分析之递归与分治策略——二分搜索技术

O(klogk) 时间算法从二进制堆中找到第 k 个最小元素

2_3 递归与分治策略(二分搜索技术)

选第k小元素:分治策略

想在含有n个元素的序列中得到最小的前k个元素,最好采用啥排序算法