最小的k个数 代码(C)

本文地址: http://blog.csdn.net/caroline_wendy

题目: 输入n个整数, 找出当中的最小k个数.

使用高速排序(Quick Sort)的方法求解, 把索引值(index)指向前k个数.

代码:

/*
* main.cpp
*
* Created on: 2014.6.12
* Author: Spike
*/ /*eclipse cdt, gcc 4.8.1*/ #include <stdio.h>
#include <stdlib.h> int RandomInRange(int min, int max) {
int random = rand() % (max-min+1) + min;
return random;
} void Swap (int* num1, int* num2) {
int temp = *num1;
*num1 = *num2;
*num2 = temp;
} int Partition(int data[], int length, int start, int end) {
if (data == NULL || length <= 0 || start < 0 || end >= length)
return -1;
int index = RandomInRange(start, end);
Swap(&data[index], &data[end]);
int small = start-1;
for (index = start; index < end; ++index) {
if (data[index] < data[end]) {
small++;
if (small != index)
Swap(&data[small], &data[index]);
}
}
small++;
Swap(&data[small], &data[end]);
return small;
} void GetLeastNumbers(int* input, int n, int* output, int k) {
if (input == NULL || n <= 0 || output == NULL || k <= 0 || k>n)
return;
int start = 0;
int end = n-1;
int index = Partition(input, n, start, end);
while (index != k-1) {
if (index > k-1) {
end = index - 1;
index = Partition(input, n, start, end);
} else {
start = index + 1;
index = Partition(input, n, start, end);
}
}
for (int i=0; i<k; ++i) {
output[i] = input[i];
}
} int main(void)
{
int input[] = {4, 5, 1, 6, 2, 7, 3, 8};
int output[4];
GetLeastNumbers(input, 8, output, 4);
for (int i=0; i<4; ++i) {
printf("%d ", output[i]);
}
printf("\n"); return 0;
}

输出:

1 2 3 4

编程算法 - 最小的k个数 代码(C)的更多相关文章

  1. 编程算法 - 最小的k个数 红黑树 代码(C++)

    最小的k个数 红黑树 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 输入n个整数, 找出当中的最小k个数. 使用红黑树(multiset) ...

  2. [算法]最小的K个数和数据流中的中位数

    1. 最小的K个数 题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4. 思路 Java 中的PriorityQueue是 ...

  3. 算法练习:寻找最小的k个数

    参考July的文章:http://blog.csdn.net/v_JULY_v/article/details/6370650 寻找最小的k个数题目描述:查找最小的k个元素题目:输入n个整数,输出其中 ...

  4. 窥探算法之美妙——寻找数组中最小的K个数&python中巧用最大堆

    原文发表在我的博客主页,转载请注明出处 前言 不论是小算法或者大系统,堆一直是某种场景下程序员比较亲睐的数据结构,而在python中,由于数据结构的极其灵活性,list,tuple, dict在很多情 ...

  5. 算法笔记_035:寻找最小的k个数(Java)

    目录 1 问题描述 2 解决方案 2.1 全部排序法 2.2 部分排序法 2.3 用堆代替数组法 2.4线性选择算法   1 问题描述 有n个整数,请找出其中最小的k个数,要求时间复杂度尽可能低. 2 ...

  6. [算法]找到无序数组中最小的K个数

    题目: 给定一个无序的整型数组arr,找到其中最小的k个数. 方法一: 将数组排序,排序后的数组的前k个数就是最小的k个数. 时间复杂度:O(nlogn) 方法二: 时间复杂度:O(nlogk) 维护 ...

  7. 算法题解:最大或最小的K个数(海量数据Top K问题)

    题目 输入 n 个整数,找出其中最小的 k 个数.例如输入4.5.1.6.2.7.3.8 这8个数字,则最小的4个数字是1.2.3.4. 初窥 这道题最简单的思路莫过于把输入的 n 个整数排序,排序之 ...

  8. 算法题解:最小的K个数(海量数据Top K问题)

    [本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究.若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!] 题目 输入 n ...

  9. 代码题(3)— 最小的k个数、数组中的第K个最大元素、前K个高频元素

    1.题目:输入n个整数,找出其中最小的K个数. 例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4. 快排思路(掌握): class Solution { public ...

随机推荐

  1. 2.10.2 section元素

    section元素 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> & ...

  2. LeetCode136,137寻找只出现一次的数

    1.题目意思:在数组中,只有一个数字只出现了一次 其他的都出现了两次.找出那个只出现一次的数字. //利用位运算 异或 两个相同的数字异或为0 public int singleNumber(int[ ...

  3. UML系统建模学习

    什么是UML系统建模 UML系统建模是一种与面向对象软件开发密切相关的建模方法.通过建造模型可以验证建造事物的可行性.UML是一种统一建模语言,它的全称是(Unified Method Languag ...

  4. 笔试算法题(12):整数的string到int转换 & 两个栈实现队列

    出题:将输入的表示整数的字符串转变为对应的整数值: 分析: 每当右边增加一位,说明之前的sum应该高一个数量级,所以*10.由于这两个实现仅仅考虑正规的.正整数输入,所以需要一个Wrapper函数,其 ...

  5. react初探索--react + react-router + ant-design 后台管理系统配置

    首先确认安装了node环境,Node >= 6. 如果对react 及 ant-design 一无所知,建议去阅读下api文档,react 可以在 codePen 在线练习. react Api ...

  6. LAMP中添加多虚拟主机

    在/etc/apache2/sites-available中默认有个default文件,其中的大致配置如下: <VirtualHost *:80> ServerAdmin xujie198 ...

  7. Python之元祖

    Python之元祖 tuple ( ) 元组和列表是一样的.但是,也有区别. 元组只能有读操作.没有修改删除操作. 列表是用中括号 [ ] 表示. 元组是用小括号 ( ) 表示. dir() 把传入的 ...

  8. SpringMVC参数接收

    1 绑定简单类型 要根据id查询商品数据,需要从请求的参数中把请求的id取出来.Id应该包含在Request对象中.可以从Request对象中取id. public ModelAndView item ...

  9. Codeforce 741B Arpa's weak amphitheater and Mehrdad's valuable Hoses(并查集&分组背包)

    题意: 给定n个价值为b 花费为w的物品, 然后某些物品是属于同一个组的, 给定一个花费限制V, 求在小于等于V的情况下取得到的价值最大为多少,能对于同一个组的物品,要么全取,要么只取一个. 分析: ...

  10. 九度oj 题目1061:成绩排序

    题目1061:成绩排序 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:24473 解决:6960 题目描述: 有N个学生的数据,将学生数据按成绩高低排序,如果成绩相同则按姓名字符的字母序排 ...