一、qsort介绍
原型:void qsort (void* base, size_t num, size_t size, int (*compar)(const void*,const void*));
Cplusplus中的解释:
对数组的元素进行排序
对数组中由 指向的元素进行排序,每个元素字节长,使用该函数确定顺序。
此函数使用的排序算法通过调用指定的函数来比较元素对,并将指向它们的指针作为参数。
该函数不返回任何值,但通过重新排序数组的元素(如 所定义)来修改指向的数组的内容。
等效元素的顺序未定义。
二、qsort详解
头文件:#include<stdlib.h> 原型:void qsort (void* base, size_t num, size_t size, int (*compar)(const void*,const void*))
base :可为数组,也可为指针(注:此指针应指向数组);
size_t num:数组长度,根据cplusplus定义,他为unsigned int
size_t size:数组元素所占字节,据cplusplus定义,他为unsigned int
compare:指向比较两个元素的函数的指针。
重复调用此函数以比较两个元素。它应遵循以下原型:qsort
int compar (const void* p1, const void* p2);
即他也可以为一个函数名.
代码如下(示例):
/* qsort example */#include <stdio.h> /* printf */#include <stdlib.h> /* qsort */ int values[] = { 40, 10, 100, 90, 20, 25 }; int compare (const void * a, const void * b) { return ( *(int*)a - *(int*)b ); }//此处为整形递增排序 int main () { int n; qsort (values, 6, sizeof(int), compare); for (n=0; n<6; n++) printf ("%d ",values[n]); return 0; }
重点:
此函数最主要的部分其实在于int (*compar)(const void*,const void*);
因为主要改变的都在在个部分,包括数据类型以及升降序.而其他部分其实就按照规则填入便可.其中size_t size可用sizeof()来计算其中一个数组元素大小便可
三、类型
Int
int compare (const void * a, const void * b) { return *(double*)a >*(double *)b ? 1 : -1;//升序 return *(double*)a <*(double *)b ? 1 : -1;//降序 }
double
int compare (const void * a, const void * b) { return *(double*)a >*(double *)b ? 1 : -1;//升序 return *(double*)a <*(double *)b ? 1 : -1;//降序 }
字符
int compare (const void * a, const void * b) { return *(char *)a - *(char *)b;//升序 return *(char *)b - *(char *)a;//降序 }
字符串
int compare (const void * a, const void * b) { return strcmp(*(const char**)a, *(const char**)b);//升序 return strcmp(*(const char**)b, *(const char**)a);//降序 }
四、实例代码
#include <stdio.h> #include <stdlib.h> /* qsort */ //Int int compare1(const void* a, const void* b) { return (*(int*)a - *(int*)b);//升序 //return ( *(int*)b - *(int*)a );//降序 } //Double int compare2(const void* a, const void* b) { return *(double*)a > *(double*)b ? 1 : -1;//升序 //return *(double*)a < *(double*)b ? 1 : -1;//降序 } //字符 int compare3(const void* a, const void* b) { return *(char*)a - *(char*)b;//升序 //return *(char*)b - *(char*)a;//降序 } //字符串 int compare4(const void* a, const void* b) { return strcmp(*(const char**)a, *(const char**)b); // 升序 //return strcmp(*(const char**)b, *(const char**)a);//降序 } int main() { int values1[] = { 40, 10, 100, 90, 20, 25 }; double values2[] = {1.2,0.42,0.2,8,3.14,15.2}; char values3[] = { 'e', 's', 'a', 'w', 'k', 'l' }; char* values4[] = { "nobody","everything","anything","nonthing","anybody","something" }; int n; qsort(values1, 6, sizeof(int), compare1); qsort(values2, 6, sizeof(double), compare2); qsort(values3, 6, sizeof(char), compare3); qsort(values4, 6, sizeof(char*), compare4); printf("Int:"); for (n = 0; n < 6; n++) printf("%d ", values1[n]); printf("\n"); printf("double:"); for (n = 0; n < 6; n++) printf("%.2lf ", values2[n]); printf("\n"); printf("字符:"); for (n = 0; n < 6; n++) printf("%c ", values3[n]); printf("\n"); printf("字符串:"); for (n = 0; n < 6; n++) printf("%s ", values4[n]); printf("\n"); return 0; }