美文网首页
数据结构与算法之选择问题

数据结构与算法之选择问题

作者: 此间不留白 | 来源:发表于2019-09-24 21:21 被阅读0次

问题描述

设有一组大小为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--如何学数据结构与算法之美2--复杂度分析(上)数据结构与算法之美3--...

  • 02数据结构与算法复杂度分析上

    数据结构与算法之美专栏笔记 1. 为什么要学习数据结构和算法 数据结构和算法本身解决的是“快”和“省”的问题,让代...

  • 重温:数据结构与算法 - 01复杂度分析(一)

    数据结构与算法之美-学习大纲 前面章节提到:为了选择正确的数据结构与算法,这就需要考量代码的执行效率和资源消耗两个...

  • 数据结构与算法之选择问题

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

  • 重温:数据结构与算法 - 03数组

    数据结构与算法之美 - 数组 数据结构与算法之美-学习大纲 什么数组? 数组是一种 线性表 数据结构。它用一组 连...

  • 数据结构与算法--最短路径之Floyd算法

    数据结构与算法--最短路径之Floyd算法 我们知道Dijkstra算法只能解决单源最短路径问题,且要求边上的权重...

  • 数据结构之栈

    (注释:整篇数据结构与算法文集,部分总结于王争的《数据结构与算法之美》和李明杰的《恋上数据结构与算法》,加上自己的...

  • 数据结构之队列

    (注释:整篇数据结构与算法文集,部分总结于王争的《数据结构与算法之美》和李明杰的《恋上数据结构与算法》,加上自己的...

  • 数据结构之二分查找的概念

    (注释:整篇数据结构与算法文集,部分总结于王争的《数据结构与算法之美》和李明杰的《恋上数据结构与算法》,加上自己的...

  • 数据结构之二叉树

    (注释:整篇数据结构与算法文集,部分总结于王争的《数据结构与算法之美》和李明杰的《恋上数据结构与算法》,加上自己的...

网友评论

      本文标题:数据结构与算法之选择问题

      本文链接:https://www.haomeiwen.com/subject/ngimyctx.html