qsort函数简介:
qsort函数包含在<stdlib.h>中
qsort函数声明如下:
void qsort(void * base,size_t nmemb,size_t size ,int(*compar)(const void *,const void *));
参数说明:
base:要排序的数组
nmemb:数组中元素的数目
size:每个数组元素占用的内存空间,可使用sizeof函数获得
compar:指向函数的指针也即函数指针。
这个函数用来比较两个数组元素,第一个参数大于,等于,小于第二个参数时,
分别显示正值,零,负值。
模仿qsort的功能实现一个通用的冒泡排序,代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct imag //定义结构体
{
char name[10] ;
double grade;
int age;
};
int int_compar (const void *p,const void *q)//比较两个数的大小
{
return *((int *)p)-*((int *)q);
}
int struct_int_com (const void *p,const void *q)//结构体整形比较
{
return ((struct imag*)p)->age-((struct imag*)q)->age;
}
int struct_str_com (const void *p,const void *q)//结构体字符串比较
{
return (strcmp ((*(struct imag*)p).name, (* (struct imag*) q).name));
}
int struct_double_com (const void *p,const void *q)//结构体浮点型比较
{
return ((*(struct imag*)p).grade > ((struct imag*)q)->grade);
}
void swap_num(void *p, void *q, int sz)//交换两个数的函数
{
int i = 0;
for (i=0; i<sz; i++)
{
char tmp = *((char *)p+i);
*((char *)p+i)= *((char *)q+i);
*((char *)q+i) = tmp;
}
}
void bubble_sort( void * arr,/*要排序的数组*/
int num, /*数组元素个数*/
int size,/*每个元素占的字节数*/
int(*compar)(const void *,const void *))/*函数指针,用来比较两个元素的大小,大于返回正值,等于返回零,小于返回负值*/
{
int i = 0;
int j = 0;
for (i=0; i<num-1; i++)
{
for(j=0; j<num-1-i; j++)
{
if (compar((char *)arr+j*size, (char *)arr+(j+1)*size) > 0)
{
swap_num((char *)arr+j*size, (char *)arr+(j+1)*size, size);
}
}
}
}
void print_num(int *arr, int sz)//打印整形数组
{
int i = 0;
for (i=0; i<sz; i++)
{
printf ("%d ", arr[i]);
}
printf ("\n");
}
void print_struct(struct imag arr[], int sz)//打印结构体数组
{
int i = 0;
printf ("姓名\t成绩\t年龄\n");
for (i=0; i<sz; i++)
{
printf ("%s\t%.2lf\t%d\n",arr[i].name , arr[i].grade, arr[i].age);
}
printf ("\n");
}
int main()
{
int i = 0;
int arr_int[10] = {1, 2, 5, 8, 6, 4, 7, 3, 80, 10};
char *arr_str[] = {"bcdef", "abcde", "efghi", "defgh", "cdefg"};
struct imag arr_stu[3]= {{"xiaomin",96.5, 18}, {"lisi", 88.2, 19}, {"wangwu", 66.9, 15}};
//排序整形数字
printf ("给整形数字排序>\n");
bubble_sort(arr_int, sizeof(arr_int)/sizeof(arr_int[0]), sizeof(arr_int[0]), int_compar);
print_num(arr_int, sizeof(arr_int)/sizeof(arr_int[0]));
printf ("\n");
//排序结构体中的整形
printf ("按结构体中的(年龄)整形排序>\n");
bubble_sort(arr_stu, sizeof(arr_stu)/sizeof(arr_stu[0]), sizeof(arr_stu[0]), struct_int_com);
print_struct(arr_stu, sizeof(arr_stu)/sizeof(arr_stu[0]));
//排序结构体中的字符串
printf ("按结构体中的(姓名)字符串排序>\n");
bubble_sort(arr_stu, sizeof(arr_stu)/sizeof(arr_stu[0]), sizeof(arr_stu[0]), struct_str_com);
print_struct(arr_stu, sizeof(arr_stu)/sizeof(arr_stu[0]));
//排序结构体中的浮点型数字
printf ("按结构体中的浮点型(成绩)排序>\n");
bubble_sort(arr_stu, sizeof(arr_stu)/sizeof(arr_stu[0]), sizeof(arr_stu[0]), struct_double_com);
print_struct(arr_stu, sizeof(arr_stu)/sizeof(arr_stu[0]));
system ("pause");
return 0;
}
####运行结果: