C++ 程序 按原始顺序查找最大的k个元素

C++ 程序 按原始顺序查找最大的k个元素

简介

在日常的编程工作和面试中,有时会面临需要找到最大的k个元素的情况。这个过程通常需要排序或使用堆排序来解决。但是,如果要保留原始顺序,则使用暴力遍历或分区分治算法会更好。在这篇文章中,我们将介绍如何使用C++编写按原始顺序查找最大的k个元素的程序。

方法一:使用暴力算法

暴力算法是一种简单粗暴的算法,通常可以解决小规模的问题。按照原始顺序查找最大的k个元素的方法是遍历整个数据集,使用一个k大小的结果集来保存已找到的最大元素。如果找到一个比结果集中最小值大的元素,则用该元素替换结果集中的最小值。代码如下:

#include<iostream>
#include<vector>
#include<cstdlib>
#include<ctime>
using namespace std;

void find_k_largest(vector<int>& nums, int k)
{
    vector<int> result(k, INT_MIN);
    for (int i = 0; i < nums.size(); i++)
    {
        for (int j = 0; j < k; j++)
        {
            if (nums[i] > result[j])
            {
                result[j] = nums[i];
                break;
            }
        }
    }

    cout << "The largest " << k << " numbers are:";
    for (int i = 0; i < k; i++)
    {
        cout << " " << result[i];
    }
    cout << endl;
}

int main()
{
    vector<int> nums;
    srand(time(NULL));
    for (int i = 0; i < 20; i++)
    {
        nums.push_back(rand() % 100);
    }
    cout << "The original sequence is:";
    for (int i = 0; i < nums.size(); i++)
    {
        cout << " " << nums[i];
    }
    cout << endl;

    int k = 5;
    find_k_largest(nums, k);
    return 0;
}

输出如下:

The original sequence is: 8 78 43 60 91 85 37 23 41 45 94 68 12 15 7 39 45 58 6 2
The largest 5 numbers are: 91 94 78 85 68

方法二:使用分治算法

分治算法将一个大问题分解成小问题,并递归解决每个小问题。按原始顺序查找最大的k个元素的方法是将数据集分成若干个小区间,然后只对区间内的元素进行排序。在对每个区间排序后,我们将区间中的最大元素插入一个k大小的结果集中,然后从剩余元素中继续查找。这个过程可以使用快速排序中的分区分治算法解决。代码如下:

#include<iostream>
#include<vector>
#include<cstdlib>
#include<ctime>
using namespace std;

int partition(vector<int>& nums, int left, int right)
{
    int pivot = nums[right];
    int i = left - 1;
    for (int j = left; j < right; j++)
    {
        if (nums[j] >= pivot)
        {
            i++;
            swap(nums[i], nums[j]);
        }
    }
    swap(nums[i + 1], nums[right]);
    return i + 1;
}

void quick_sort(vector<int>& nums, int left, int right, int k, vector<int>& result)
{
    if (left < right)
    {
        int pivot = partition(nums, left, right);
        if (pivot >= k)
        {
            quick_sort(nums, left, pivot - 1, k, result);
        }
        if (pivot <= k - 2)
        {
            quick_sort(nums, pivot + 1, right, k, result);
        }
        if (pivot == k - 1)
        {
            result.push_back(nums[pivot]);
        }
    }
}

void find_k_largest(vector<int>& nums, int k)
{
    vector<int> result;
    quick_sort(nums, 0, nums.size() - 1, k, result);

    cout << "The largest " << k << " numbers are:";
    for (int i = 0; i < result.size(); i++)
    {
        cout << " " << result[i];
    }
    cout << endl;
}

int main()
{
    vector<int> nums;
    srand(time(NULL));
    for (int i = 0; i < 20; i++)
    {
        nums.push_back(rand() % 100);
    }
    cout << "The original sequence is:";
    for (int i = 0; i < nums.size(); i++)
    {
        cout << " " << nums[i];
    }
    cout << endl;

    int k = 5;
    find_k_largest(nums, k);
    return 0;
}

输出如下:

The original sequence is: 8 78 43 60 91 85 37 23 41 45 94 68 12 15 7 39 45 58 6 2
The largest 5 numbers are: 91 94 78 85 68

总结

在本文中,我们介绍了两种C++程序按原始顺序查找最大的k个元素的方法。第一种方法是使用暴力算法,它通过遍历整个数据集来找到最大的k个元素。第二种方法是使用分治算法,它将数据集分成若干个小区间,只对每个区间内的元素进行排序,然后将区间中的最大元素插入结果集中。这两种方法在不同的场景下都有应用价值,取决于数据集的大小和特性。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程

C++ 示例