第k小的数-桶排序

题号: 10066
时限:1000ms
限制内存:32768KB
题目: 第k小的数

描述

给定一个数组a和一个整数k, 找出数组中第k小的数. (注意, 本题中相等的数看作不同, 比如数列{1, 2, 2, 3}中第3小的数是2而不是3)
输入格式

第一行, 两个整数, n(1<=n<=5000000)表示数组的元素个数, k(1<=k<=n).
第二行, 数组中的n个整数(1<=a[i]<=10000).
输出格式

输出第k小的数.
输入样例

4 3
1 2 2 3
输出样例

2
#include<stdio.h>
int m[10000]={0}; 
int main()
{
    int i,n,a,j,k;
    scanf("%d%d",&n,&k);
    for(i=0;i<n;++i)
    {
        scanf("%d",&a);
        m[a]++;
    }
    int count=0;
    for(i=1;i<=10000;++i)
    {
        if(m[i]!=0)
        {
            for(j=0;j<m[i];++j)
            {
                count++;
                if(count==k)
                {
                    printf("%d\n",i);
                    break;
                }
            }
        }
    }
    return 0;
} 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是C语言实现桶排序找最小的k个的示例代码: ``` #include <stdio.h> #include <stdlib.h> #include <limits.h> void bucket_sort(int arr[], int n, int k) { int max_num = INT_MIN, min_num = INT_MAX; for (int i = 0; i < n; i++) { if (arr[i] > max_num) { max_num = arr[i]; } if (arr[i] < min_num) { min_num = arr[i]; } } int bucket_size = (max_num - min_num) / k + 1; int **buckets = (int **)malloc(bucket_size * sizeof(int *)); for (int i = 0; i < bucket_size; i++) { buckets[i] = (int *)malloc(n * sizeof(int)); } int *counters = (int *)malloc(bucket_size * sizeof(int)); for (int i = 0; i < bucket_size; i++) { counters[i] = 0; } for (int i = 0; i < n; i++) { int index = (arr[i] - min_num) / k; buckets[index][counters[index]] = arr[i]; counters[index]++; } int count = 0; for (int i = 0; i < bucket_size; i++) { for (int j = 0; j < counters[i]; j++) { arr[count] = buckets[i][j]; count++; if (count == k) { break; } } if (count == k) { break; } } for (int i = 0; i < bucket_size; i++) { free(buckets[i]); } free(buckets); free(counters); } int main() { int arr[] = { 5, 2, 8, 3, 9, 1, 6, 4, 7 }; int n = sizeof(arr) / sizeof(arr[0]); int k = 4; bucket_sort(arr, n, k); printf("The smallest %d numbers are: ", k); for (int i = 0; i < k; i++) { printf("%d ", arr[i]); } printf("\n"); return 0; } ``` 在这个示例代码中,我们先找到输入组中的最大值和最小值,然后根据最大值和最小值计算出桶的大小。然后我们创建一个二维组buckets来保存桶,一个一维组counters来保存每个桶中元素的量。接下来,我们将输入组中的元素分配到各个桶中,然后按照桶的顺序将桶中的元素合并到输入组中。最后,我们释放桶和计器的内存。 在main()函中,我们定义了一个输入组arr和一个整k。我们将arr和组的大小n传递给bucket_sort()函,然后输出最小的k个字。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值