在集合中查找前k个最小的数

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3
 4 #define SIZE 10
 5
 6 int * k_thSmallest(int * arr, int len, int k_len);
 7
 8 void find(int* arr, int low, int high, int k_len);
 9
10 void swap(int * a, int *b);
11
12 void printArr(int * arr, int len);
13
14 int main()
15 {
16     int arr[SIZE] = { 54,5,19,7,49,23,38,16,9,43 };
17     int k_len = 4;
18     int* outArr = k_thSmallest(arr, SIZE, k_len);
19     printArr(outArr, k_len);
20     free(outArr);
21     return 0;
22 }
23
24 void printArr(int * arr, int len)
25 {
26     for (int i = 0; i < len; i++)
27         printf("%d ", arr[i]);
28     printf("\n");
29 }
30
31 void swap(int * a, int *b)
32 {
33     int temp = *a;
34     *a = *b;
35     *b = temp;
36 }
37
38 void find(int* arr, int low, int high, int k_len)
39 {
40     int pivot = arr[high];
41     int j = low;
42     for (int i = low; i <= high; i++)
43     {
44         if (arr[i] <= pivot) {
45             swap(&arr[i], &arr[j]);
46             j++;
47         }
48     }
49     j--;
50     if (j == k_len)
51         return;
52     else if (j > k_len)
53         find(arr, low, j - 1, k_len);
54     else find(arr, j + 1, high, k_len);
55 }
56
57 int * k_thSmallest(int * arr, int len, int k_len)
58 {
59     find(arr, 0, len - 1, k_len);
60     int* result = (int*)malloc(k_len * sizeof(int));
61     for (int i = 0; i < k_len; i++)
62         result[i] = arr[i];
63     return result;
64 }

原文地址:https://www.cnblogs.com/endenvor/p/8472669.html

时间: 2024-08-05 06:27:55

在集合中查找前k个最小的数的相关文章

在N个数中查找前K个最大数

在N个数中查找前K个最大数,主要利用小堆的特点,小堆,是根节点元素小于左右子树元素,查找前K个最大数,先将N个数中的前K个数生成小堆,接着,依次将N中的剩余的数与小堆的根节点相比,如果大于根节点,则根节点换为这个数,再将堆进行生成小堆,依次直到N中无剩余,代码如下 #define N 10000 #define K 100 void Create(int top[],int parent) { int child = 2 * parent + 1; while (child < K) { if

基于快速排序的查找前K个最大数

快速排序 下面是之前实现过的快速排序的代码. function quickSort(a,left,right){ if(left<right){ let mid=partition(a,left,right);//选出key下标 quickSort(a,left,mid-1);//对key的左半部分排序 quickSort(a,mid+1,right)//对key的右半部份排序 } } function partition(a,left,right){ let key=a[left];//一开始

从海量数据中查找出前k个最小或最大值的算法(java)

现在有这么一道题目:要求从多个的数据中查找出前K个最小或最大值 分析:有多种方案可以实现.一.最容易想到的是先对数据快速排序,然后输出前k个数字.   二.先定义容量为k的数组,从源数据中取出前k个填充此数组,调整此数组的最大值maxValue到首位,然后对剩下的n-k个数据迭代,对于每个遍历到的数字x,如果x < maxValue,用x把maxValue替换掉,然后调整数组最大值的位置. 三.基于二的思路,维护容量为k的堆,从源数据中取出前k个填充实例化堆,调整此堆中的最大值maxValue到

从一个集合中查找最大最小的N个元素——Python heapq 堆数据结构

Top N问题在搜索引擎.推荐系统领域应用很广, 如果用我们较为常见的语言,如C.C++.Java等,代码量至少也得五行,但是用Python的话,只用一个函数就能搞定,只需引入heapq(堆队列)这个数据结构即可.今天偶然看到这个库,特意记下之. 先看一个例子: 1 >>> import heapq 2 >>> nums = [1,8,2,23,7,-4,18,23,42,37,2] 3 >>> print heapq.nlargest(3, nums

每日一题:查找前k个最小值

查找前k个最小值最直接的方式是遍历输入数组k遍,每次找出剩下输入中的最小值,每次查找过程中采用交换的策略,这样程序运行结束原数组的前k个数就是按顺序排列的前k个最小数,第二种思路是维护一个具有k个元素的查找树(初始化为输入数组的前k个数),对输入数组的后续每个元素a,将其与查找树的最大数b比较,如果a>=b,则什么也不做,如果a < b,则将b删除,再将a插入到查找树中,如此即可在O(n+klogn)时间内找到输入数组中的前k个最小值.第三种思路是在原数组上运行k遍初始化最小堆算法,第四种思路

6041 I Curse Myself(点双联通加集合合并求前K大) 2017多校第一场

题意: 给出一个仙人掌图,然后求他的前K小生成树. 思路: 先给出官方题解 由于图是一个仙人掌,所以显然对于图上的每一个环都需要从环上取出一条边删掉.所以问题就变为有 M 个集合,每个集合里面都有一堆数字,要从每个集合中选择一个恰好一个数加起来.求所有的这样的和中,前 K 大的是哪些.这就是一个经典问题了. 点双联通就不说了 都一眼能看出来做法就是缩点之后每个环每次取一个,然后找最大的k个所以这道题的难点就在这里,做法当然是不知道啦,看了题解和博客才懂的.以前做过两个集合合并的,这个是k个合并,

多个有序数列中查找第k小值

问题描述:现有n个有序序列如(2,3,9),(3,5,11,23),(1,4,7,9,15,17,20),(8,15,35,9),(20,30,40),请求出第k小值. 问题分析:可用多路归并排序将所有序列进行排序后取第k个值,但是只要求求出第k小值将所有数组排序未免显得有点浪费,所以我们可以使用包含k个元素的堆完成,对于每组元素取出前k小的,依次进行比较,得到总的前k小 执行步骤: 一.建初堆:从第一组数中取出前k小的元素建初始大根堆(若不足k个则取全部元素), 二. 1 .补充堆:若堆中元素

k个最小的数

输入n个整数,输出k个最小的数.例如输入4,5,1,6,2,7,3,8这8个数,则最小的4个数字是1,2,3,4.利用堆排序 (1)遍历数组,将前k个数插入到堆中,使用multiset来实现堆(2)继续从输入数组中读入元素,作为待插入的整数,并将它与堆中的最大值进行比较,若待插入的值比这个最大值小,则用它替换最大值,否则抛弃这个数,继续读取下一个数.动态的维护堆中的数都是最小的,最后输出堆即可.multiset和set的区别是multiset允许元素重复.如果本题变为求k个最大的数,则将最大堆变

若干个(大量)数字中找前K大/小的元素--数值型

方法一:根据快速排序划分的思想 : (1) 递归对所有数据分成[a,b)b(b,d]两个区间,(b,d]区间内的数都是大于[a,b)区间内的数 : (2) 对(b,d]重复(1)操作,直到最右边的区间个数小于100个. 注意[a,b)区间不用划分 :因为[a,b)区间一定小于(b,d]区间: (3) 返回上一个区间,并返回此区间的数字数目. 如果个数大于100,对(b,d]重复(1)操作,直到最右边的区间个数小于100个: 如果个数小于100,对上一区间的左边进行划分,分为[a2,b2)b2(b