经典算法学习——最小的k个数

来源:互联网 发布:软件怎么添加信任 编辑:程序博客网 时间:2024/05/01 20:10

        经常面试的同学可能会遇到这个问题,即输出数组中的最小的k个数。同样的,这也是剑指Offer上面的一道题。这道题最简单的思路莫过于把输入的n个整数排序,排序之后位于最前面的k个数就是最小的k个数。这样实现的复杂度为O(nlogn)。如果大家看了上一篇博客《经典算法学习——数组中出现次数超过一半的数字》后,其实会发现两道题的思路是一样的,也就是要找到一个index值,它的前面都比它小,后面的都比它大。目的是怎样来找到这个合适的index值。当然根据前面的题目要求,输出的k个值可以是不排序的。代码上传至 https://github.com/chenyufeng1991/LeastKNumber.git 。

实现如下:

// 数组中最小的k个数#include <stdio.h>#include <stdlib.h>void LeastKNumber(int *arr, int start, int end, int k);int Partition(int *arr, int start, int end);int main(int argc, const char * argv[]){    int array[] = {5, 3, 7, 1, 0, 9};    LeastKNumber(array, 0, 5, 5);    return 0;}void LeastKNumber(int *arr, int start, int end, int k){    int index = Partition(arr, start, end);    while (index != k)    {        if (index > k)        {            index = Partition(arr, start, index - 1);        }        else        {            // index < k            index = Partition(arr, index + 1, end);        }    }    if (index == k)    {        for (int i = 0; i < k; i++)        {            printf("%d ",arr[i]);        }        return;    }}int Partition(int *arr, int start, int end){    int i = start, j = end, x = arr[start];    while (i < j)    {        while (i < j && arr[j] >= x)        {            j--;        }        if (i < j)        {            arr[i++] = arr[j];        }        while (i < j && arr[i] < x)        {            i++;        }        if (i < j)        {            arr[j--] = arr[i];        }    }    arr[i] = x;        return i;}


1 0
原创粉丝点击