c++求数组中的最小(大)的n位数

#include <iostream>
using namespace std;

class MaxHash
{
public:
    MaxHash(int n)
    {
        data = new int[n];
        size = n;
    }
    void Insert(int a[], int n)
    {
        int i = 0;
        for (; i < size; i++)//初始化数组
        {
            data[i] = a[i];
        }
        int j = size / 2;
        while (j >= 0)//构造堆
        {
            InitHash(data,j);
            j--;
        }
        while (i < n)//找出最小的size个数字
        {
            if (a[i] < data[0])
            {
                data[0] = a[i];
                InitHash(data,0);
            }
            i++;
        }
        for (i = 0; i < size; i++)//打印找到的这size个数字
        {
            cout << data[i] << " ";
        }
        cout << endl;
    }
    void InitHash(int a[], int n)
    {
        int i = n;
        int j = 2 * i + 1;
        while (j< size)
        {
            int tmp = a[i];
            if (j+1<size &&a[j] < a[j + 1])
                j = j + 1;
            if (a[i] < a[j])
            {
                a[i] = a[j];
                a[j] = tmp;
            }
            i = j;
            j = 2 * i + 1;
        }
    }
private:
    int *data;
    int size;
};
int main()
{
    MaxHash mh(4);
    int a[] = { 0,100, 88, 77, 66, 55, 44, 33, 22, 22, 11, 5, 4, 3, 2, 1, 1 };
    mh.Insert(a, 17);
}
时间: 2025-01-11 20:41:14

c++求数组中的最小(大)的n位数的相关文章

求数组中绝对值最小的元素

给定一个有序数组a(从小到大排列),数组中的数据有正有负,找出这个数组中的绝对值最小的元素.最先到的自然是从头到尾依次遍历数组中的每个元素,找出绝对值最小的元素.这是最简单的方法,不过它并没有用到数组有序这个特性,现在我们来看看有没有更好的方法.题目要求在数组中查找元素,并且此数组有序,那么可以想到用二分法来处理. 首先我们先看一下如果数组中元素全部为正数或者全部为负数的情况: 如果a[0]>0,那么数组中所有元素均为正数,则a[0]为绝对值最小的元素 如果a[len-1]<0,那么数组中所有

求数组中第k大的数(分治法)

思想:快排 因为单趟排序是使选定的king值到其应该到的位置,所以每次判断这个king的正确位置是否是第K大数的位置即可 #include <iostream> using namespace std; //快排中的单趟排序 int PartSort(int* arr,int start,int end) { int first = start; int last = end; int tmp = arr[first]; int key = first; while (first < l

用C随机产生的正整数存到数组中,并求数组中的所有元素最大值、最小值、平均值以及各元素之和,及第二大值。

用 C 求一组随机数的第二大值,不能通过对整体排序求得 1 随机产生20个[10 , 50]的正整数存到数组中,并求数组中的所有元素最大值.最小值.平均值以及各元素之和,及第二大值.        int a[20];    int sum = 0; //存储数组元素的和    //为数组赋值    printf("数组中的元素为:\n ");    for (int i = 0; i < 20; i ++) {        a[i] = arc4random() % 41 +

[经典面试题]排序数组中绝对值最小元素

[题目] 题目为: 有一个已经排序的数组(升序),数组中可能有正数.负数或0,求数组中元素的绝对值最小的数,要求,不能用顺序比较的方法(复杂度需要小于O(n)),可以使用任何语言实现 例如,数组{-20,-13,-4, 6, 77,200} ,绝对值最小的是-4. [分析] 给定数组是已经排好序的,且是升序,没有重复元素. 一个简单的思路,就是一次性遍历数组,求出数组的元素的绝对值的最小值,这样的时间复杂度为O(n). 但是,这样就浪费了题目的一个条件:数组是已经排好序的.所以,需要对原来的题目

[LeetCode] Kth Largest Element in an Array 数组中第k大的数字

Find the kth largest element in an unsorted array. Note that it is the kth largest element in the sorted order, not the kth distinct element. For example, Given [3,2,1,5,6,4] and k = 2, return 5. Note: You may assume k is always valid, 1 ≤ k ≤ array'

算法题:求数组中最小的k个数

说明:本文仅供学习交流,转载请标明出处,欢迎转载! 题目:输入n个整数,找出其中最小的k个数. <剑指offer>给出了两种实现算法: 算法1:采用Partition+递归法,该算法可以说是快速排序和二分查找的有机结合.算法的时间复杂度为O(n),缺点在于在修改Partition的过程中会修改原数组的值. 算法2:采用top-k算法.如果要找最小的K个数,我们才用一个含有K个值的大顶堆:如果要找最大的K个数,我们采用小顶堆.该算法的时间复杂度为O(nlogK),是一种比较好的算法,启发于堆排序

求一无序数组中第n大的数字 - 快速选择算法

逛别人博客的时候,偶然看到这一算法题,顺便用C++实现了一下. 最朴素的解法就是先对数组进行排序,返回第n个数即可.. 下面代码中用的是快速选择算法(不晓得这名字对不对) 1 #include <vector> 2 #include <iostream> 3 #include <stdexcept> 4 #include <cstdio> 5 6 const int QS_EERRMSG_LEN = 256; 7 8 9 /** 10 * 快速选择求无序数组

微软算法100题69 求旋转数组中的最小元素

69.求旋转数组中的最小元素.题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个排好序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1 思路: 1. 可以从左到右扫描整个数组,找出最小的那个,时间复杂度是o(n) 2. 也可以利用旋转数组本身的特性,即部分有序,然后借助二分查找的方法来解决,先找中间点mid = left + (right - left)/2, 如果a[le

求数组中最小的数值(结合apply() call())

// 求一个数组中的最小值 Math.min.apply(this,[100,2,3])call() apply() 改变作用域,区别:第二个参数不同 call(this,name:'hjdj',age:17) 单个写, apply(this,[{name:'hjdj'},{age:17}])数组形式 求数组中确定值的索引$.inArray(200,[100,200,300]) 返回1 原文地址:https://www.cnblogs.com/yaomengli/p/10148269.html