1、通用快速排序函数,可以处理不同类型的数据:qsort(base,num,width,compare)
base:数组开始地址
num:数组个数
width:元素大小(已字节为大小)
compare:数组中两个数比较的规则
2、对下列数组中的值进行排序
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int Compare_int(const void* a, const void* b)
{
int arg1 = *(const int*)a;//指针解引用
int arg2 = *(const int*)b;//先强转统一类型,在解引用
if (arg1 > arg2)
{
return 1;
}
else if (arg1 < arg2)
{
return -1;
}
else
{
return 0;
}
//return (arg1>arg2)-(arg1 < arg2)//一行代码可以替换上述整个if
}
int Compare_string(const void*a, const void* b)
{
const char *arg1 = *(const char**)a;//crr指针退化成二级指针,所以**,解引用一次,所以用指针接收
const char *arg2 = *(const char**)a;
int tmp = strcmp(arg1, arg2);
return tmp;
}
int Compare_double(const void* a, const void* b)
{
double arg1 = *(const double*)a;//drr传进来退化成指针,用*,解引用完用相同类型变量接收
double arg2 = *(const double*)b;
double tmp = arg1 - arg2;
double ESP = 0.000001;
if (tmp<=ESP && tmp>=-ESP)
{
return 0;
}
else if(tmp>ESP)
{
return 1;
}
else
{
return -1;
}
}
void Show(int* arr, int len)
{
for (int i = 0; i < len; i++)
{
printf("%d", arr[i]);
}
printf("\n");
}
void Show_string(const char* arr[], int len)
{
for (int i = 0; i < len; i++)
{
printf("%s ", arr[i]);
}
printf("\n");
}
void Show_double(double* arr, int len)
{
for (int i = 0; i < len; i++)
{
printf("%f ", arr[i]);
}
printf("\n");
}
int main()
{
int arr[] = {5,4,6,7,3,2};
qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(int), Compare_int);
Show(arr, sizeof(arr) / sizeof(arr[0]));
const char* crr[] = {"xyz","quan","zhang","li"};
qsort(crr, sizeof(crr) / sizeof(crr[0]), sizeof(char *), Compare_string);
Show_string(crr , sizeof(crr) / sizeof(crr[0]));
double drr[] = { 32,22.3,45.3,12.6,41.6 };
qsort(drr, sizeof(drr) / sizeof(drr[0]), sizeof(double), Compare_double);
Show_double(drr, sizeof(drr) / sizeof(drr[0]));
}
结果: