《数据结构与算法分析》之选择问题

问题描述

设有一组大小为N的数据,我们要选出其中第K个最大值,对于此类问题,可以由以下两种方法实现。

算法实现:

  1. 排序法:
    排序法的实现思想是将所有数据先按照从大到小的顺序排序,再返回第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,随着更加深入的学习,会有更加高明的算法。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值