问题描述
设有一组大小为N的数据,我们要选出其中第K个最大值,对于此类问题,可以由以下两种方法实现。
算法实现:
- 排序法:
排序法的实现思想是将所有数据先按照从大到小的顺序排序,再返回第K个元素,算法实现比较简单,用C++代码实现如下所示:
/*选泽问题,
问题描述:
假设有一组大小为N的数据,要找出前K个元素的大小,并确定其第K个最大值,并将其返回。
input: 1,3,54,65,7,8,89,k=3
output: 54
author:ElmaDavies
Date: 2019 - 09 -09
editor:cvisual code
先选择最简单的冒泡排序算法,最后直接返回第K个元素
*/
#include<iostream>
using namespace std;
void bubble_sort(int *a); //冒泡排序
int find_K(int *a,int k); //寻找第K大的元素
void print_all_value(const int *a); //打印整个数组
//交换两个数
void swap(int &a,int &b)
{
a = a + b;
b = a - b;
a = a - b;
}
int main()
{
int a[10] ={0,3,9,6,2,7,6,1,10,4};
int k = 2;
int value = find_K(a,k);
cout << value << endl;
system("pause");
return 0;
}
void bubble_sort(int *a)
{
for (int i = 0; i < 10;i++)
{
for (int j = 0; j < 10-i-1;j++)
{
if(a[j]<a[j+1])
{
swap(a[j+1], a[j]);
}
}
}
}
int find_K(int *a, int k)
{
bubble_sort(a);
return a[k];
}
void print_all_value(const int *a)
{
for (int i = 0; i < 9;i++)
cout << a[i]<<",";
cout << a[9] << endl;
}
2.比较法:
第二种方法可以简单称之为比较法,具体实现思路是:
将N个数的前K个数读入一个数组,并对其进行递减排序,依次比较剩下的每个元素,如果,某个元素大于第K个数,则将其变成第K个元素,并重新排序,一直到比较完所有的数为止!
具体的实现代码可以如下所示:
/*选泽问题,
问题描述:
假设有一组大小为N的数据,要找出前K个元素的大小,并确定其第K个最大值,并将其返回。
input: 1,3,54,65,7,8,89,k=3
output: 8
author:ElmaDavies
Date: 2019 - 09 -09
editor:visual code
将N个数的前K个数读入一个数组,并对其进行递减排序,依次比较剩下的每个元素,
如果,某个元素大于第K个数,则将其变成第K个元素,并重新排序,一直到比较完所有的数为止!
*/
#include<iostream>
using namespace std;
void find_k(int *a, int k); //寻找k个元素
void bubbleSort(int *a,int k); //对前k个元素,进行排序
void read_K(int *a,int k); //读入第K个元素
//交换两个数
void swap(int &a,int &b)
{
a = a + b;
b = a - b;
a = a - b;
}
int main()
{
int a[10] ={0,3,9,6,2,7,6,1,10,4};
find_k(a,3);
system("pause");
return 0;
}
void bubbleSort(int *a,int k)
{
for (int i=0; i < k;i++)
{
for (int j = 0; j < k - 1 - i;j++)
{
if(a[j]<a[j+1])
{
swap(a[j],a[j+1]);
}
}
}
}
void find_k(int *a,int k)
{
if(k>10||k<0)
{
cout << "输入错误,请重新选择" << endl;
exit(0);
}
bubbleSort(a, k);
for (int i = k-1;i<10;i++)
{
if(a[k-1] <= a[i])
{
a[k-1] = a[i];
}
bubbleSort(a, k);
}
cout << a[k - 1] << endl;
}
总结:
以上两种实现方式都用到了冒泡排序算法,执行效率并不高,当考虑到数据量较大时,可以选择更为高效的排序算法,如快速排序,归并排序等。对比以上两种方法,第一种方法更适用于K较大的条件,而第二种更适用于K值较小的选择条件,总体而言,两种实现方式并不理想,只是《数据结构与算法分析》初始学习的一个小demo,随着更加深入的学习,会有更加高明的算法。
网友评论