求无序数组中最小的k个数

本文介绍如何从一个无序数组中找出最小的k个数,保持原有顺序。通过创建两个辅助数组,排序后找到第k个值作为基准,遍历原数组并与基准比较,将小于等于基准的数存入结果数组。

题目描述

对于一个无序数组,数组中元素为互不相同的整数,请返回其中最小的k个数,顺序与原数组中元素顺序一致。
给定一个整数数组A及它的大小n,同时给定k,请返回其中最小的k个数。
测试样例:
[1,2,4,3],4,2
返回:[1,2]

思想:首先创建两个数组,一个命名为C用来保存最小的k个值,一个命名为B用来复制A数组的值,然后对B进行排序,找到第K个值赋值给temp,将A数组中的元素与一一与temp进行比较,小于等于temp的就保存到C数组,否则不做任何操作,直到找到所有的值为止

import java.util.*;

public class KthNumbers {
    public int[] findKthNumbers(int[] A, int n, int k) {
        // write code here
        int temp =0;
        //用来保存最小的k个数
        int[] C = new
### 使用最大堆和最小堆寻找无序数组中位数 为了高效地找到无序数组中的中位数及其原始下标,可以采用最大堆和最小堆相结合的方法。这种方法能够在O(log n)时间内完成插入操作,并保持数据结构平衡以便随时获取当前的中位数值。 具体实现如下: 1. 创建两个优先队列:一个是大根堆用于存储较小的一半元素;另一个是小根堆用来保存较大的一半元素。 2. 当新加入一个元素时,如果这个值小于等于大根堆顶,则将其放入大根堆;反之则进入小根堆。 3. 维护这两个堆之间的大小关系使得它们要么相等,要么大根堆多出一个小于等于小根堆顶部的那个唯一额外项。 4. 如果总数量为奇数,则中位数就是大根堆顶端元素;如果是偶数的话,那么中位数将是两者顶端元素平均值得到的结果[^1]。 然而上述方法并不能直接给出原数组里的索引位置。对于这个问题,可以在向堆里添加元素的同时维护一个哈希表来追踪每个值对应的初始索引。这样,在最终确定中位数后就可以通过查表得到其原本所在的位置了。 另外一种更简单但效率稍低的办法是先复制一份输入列表并对其进行排序处理,再依据定义从中选出位于中央处的目标数字,最后回到未排序版本的数据集中定位该目标的具体地址[^2]。 下面是基于Python语言的一个简易示例程序展示如何利用快速排序思想配合映射机制获得所需结果: ```python def find_median_index(arr): import copy # 复制数组以防修改原有数据 sorted_arr = copy.deepcopy(arr) # 对副本执行排序 sorted_arr.sort() length = len(sorted_arr) median_value = (sorted_arr[length // 2] + sorted_arr[(length - 1) // 2]) / 2 index_map = {value: idx for idx, value in enumerate(arr)} try: result_idx = index_map[median_value] except KeyError as e: # 若不存在确切匹配的情况(例如浮点型中位数) lower_bound = min(index_map.keys(), key=lambda k: abs(k-median_value)) result_idx = index_map[lower_bound] return result_idx test_array = [7, 9, 3, 5, 1] print(f"The original array is :{test_array}") result = find_median_index(test_array) print(f"Median element's original position was at index:{result}.") ``` 此代码片段展示了如何创建一个新的已排序序列以识别其中心值,并借助字典对象建立从值到原来索引间的对应关系,从而能够返回所中位数最初所在的下标位置[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值