LeetCode:面试题40. 最小的k个数

40. 最小的k个数

题目:

在这里插入图片描述

解题思路:

1、快速排序:
2、堆排序:
详细解释看leetcode的官网

源码:

int comp(void *a,void *b){
    int *A = (int*)a;
    int *B = (int*)b;
    return *A - *B;
}    
int* getLeastNumbers(int* arr, int arrSize, int k, int* returnSize){
    qsort(arr,arrSize,sizeof(int),comp);
    int *output=(int*)malloc(sizeof(int)*k);
    for(int i=0;i<k;i++){
        output[i]=arr[i];
    }
    *returnSize=k;
    return output;
}

ps:qsort()函数包含在stdlib.h头文件中
qsort()用法:
void qsort(void* base,size_t num,size_t width,int(__cdeclcompare)(const void,const void*));
参数1:要比较的数组
参数2:数组长度
参数3:数组类型
参数4:自定义比较排序,升序还是降序;
cmp()用法:
int cmp(const void *a, const void *b);

1、对int数组排序:

int cmp_int(const void* _a , const void* _b)  //参数格式固定
{
    int* a = (int*)_a;    //强制类型转换
    int* b = (int*)_b;
    return *a - *b;  
}
默认升序排列(从小到大),如果想降序排列返回*b-*a即可。

2、对char数组排序:

int cmp_char(const void* _a , const void* _b)  //参数格式固定
{
    char* a = (char*)_a;    //强制类型转换
    char* b = (char*)_b;
    return *a - *b;  
}

qsort(word,100,sizeof(word[0]),cmp_char); 
默认升序排列(从小到大),如果想降序排列返回*b-*a即可。

3、对double数组排序:

double in[100];
int cmp_double(const void* _a , const void* _b)  //参数格式固定
{
    double* a = (double*)_a;    //强制类型转换
    double* b = (double*)_b;
    return *a > *b ? 1 : -1;   //特别注意
}

qsort(in,100,sizeof(in[0]),cmp_double); 
在对浮点或者double型的一定要用三目运算符,因为要是使用像整型那样相减
的话,如果是两个很接近的数则可能返回一个很小的小数(大于-1,小于1),
而cmp的返回值是int型,因此会将这个小数返回0,系统认为是相等,失去了
本来存在的大小关系

4、对字符串排序:

char word[100][10];
int cmp_string(const void* _a , const void* _b)  //参数格式固定
{
    char* a = (char*)_a;  //强制类型转换
    char* b = (char*)_b;
    return strcmp(a,b);
}

qsort(word,100,sizeof(word[0]),cmp_string); 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值