C语言编译器函数库自带的排序函数——qsort函数及例子
一、qsort函数介绍(可以处理不同类型的数组数据)
(详细介绍见qsort_百度百科 (baidu.com))
- 头文件:
#include<stdlib.h>
- 函数原型:
二、例子
例一:针对整型值进行排序, 对“4,8,7,5,2,3,5,9,6”进行排序。
#include<stdlib.h>
int Compare_int(const void* a, const void* b)//定义比较函数
{
int arg1 = *(const int*)a;//先强转,再解引用
int arg2 = *(const int*)b;
return (arg1 > arg2) - (arg1 < arg2);
/*也可以用以下if判断语句
if(arg1 > arg2)
{
return 1;
}
if (arg1 < arg2)
{
return -1;
}
else
{
return 0;
}*/
}
void Show_int(int arr[], int len)//展示函数
{
for (int i = 0; i < len; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
主函数
#include<stdio.h>
int main()
{
int arr[] = { 4,8,7,5,2,3,5,9,6 };
qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(int), Compare_int);
Show_int(arr, sizeof(arr) / sizeof(arr[0]));
return 0;
}
结果
例二:针对浮点值进行排序, 对“34.2,22.1,35.6,44.7,12.6”进行排序。
#include<stdlib.h>
int Compare_double(const void* a, const void* b)
{
double arg1 = *(const double*)a;//先强转,再解引用
double arg2 = *(const double*)b;
double tmp=arg1 - arg2;
double EPS = 1e-6;//定义误差
if (-EPS <= tmp && tmp >= EPS)//在误差范围之内,则两个数相等
{
return 0;
}
else if(tmp>EPS)
{
return 1;
}
else
{
return -1;
}
}
void Show_double(double brr[], int len)//展示函数
{
for (int i = 0; i < len; i++)
{
printf("%f ", brr[i]);
}
printf("\n");
}
主函数:
#include<stdio.h>
int main()
{
double brr[] = {34.2,22.1,35.6,44.7,12.6};
qsort(brr, sizeof(brr) / sizeof(brr[0]), sizeof(double), Compare_double);
Show_double(brr, sizeof(brr) / sizeof(brr[0]));
return 0;
}
结果:
例三:针对字符串进行排序, 对"abc","xyz","quan","hou","zhang","wang"进行排序。
#include<stdlib.h>
int Compare_string(const void* a, const void* b)
{
const char* arg1 = *(const char**)a;//先强转,再解引用
const char* arg2 = *(const char**)b;
int tmp = strcmp(arg1,arg2);
//strcmp函数是string compare(字符串比较)的缩写,用于比较两个字符串并根据比较结果返回整数。
//基本形式为strcmp(str1,str2),
//若str1=str2,则返回零;若str1<str2,则返回负数;若str1>str2,则返回正数。
return tmp;
}
void Show_string(const char* crr[], int len)//展示函数
{
for (int i = 0; i < len; i++)
{
printf("%s ", crr[i]);
}
printf("\n");
}
主函数:
#include<stdio.h>
int main()
{
const char *crr[] = { "abc","xyz","quan","hou","zhang","wang"};
qsort(crr, sizeof(crr) / sizeof(crr[0]), sizeof(char*), Compare_string);
Show_string(crr, sizeof(crr) / sizeof(crr[0]));
return 0;
}
结果: