题目:
解题思路:
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);