C函数qsort的简介和用法
BY:SMJUN
C函数qsort实现快速排序
排序方法有很多种:选择排序,冒泡排序, 归并排序,快速排序等。 看名字都知道快速排序 是目前公认的一种 比较好的排序算法,比选择排序,冒泡排 序都要快。因为它的速度很快,所以系统 也在库里实现这个算法,便于我们的使用。 这就是qsort。
qsort简介
• qsort函数是ANSI C标准中提供的,其声明在 stdlib.h文件中,是根据二分发写的,其时间复杂 度为n*log(n),其结构为: • void qsort(void *base,size_t nelem,size_t width, cmp); • *base 为要排序的数组 • nelem 为要排序的数组的长度 • width 为数组元素的大小(一字节为单位) • 简单示例:对int num[100]排序,qsort中各参数 怎么写? • qsort(num,100,sizeof(num[0]),cmp);
自定义比较函数
• 比较函数的名字是自定义的(这里我们用CMP命名); • Cmp:qsort 要求提供的这个函数是一个需要自己定义的比较函 数,比较函数使得qsort通用性更好。有了比较函数qsort可以实 现对数组,字符串,结构体等结构进行升序或降序排序。 • Int Cmp(const void *a , const void *b )中有两个元素作为参数, 返回一个int值, 如果比较函数返回大于0,qsort就认为 a>b , 如果比较函数返回等于0 qsort就认为a 和b 这两个元素相等,返 回小于零 qsort就认为 ab),你比较函数却返 回一个 -1 (小于零的)那么qsort认为a
简单示例:对int num[100]中的元素从小到大排序。 int num[100]; int cmp ( const void *a , const void *b ) { return *(int *)a - *(int *)b; //强制转换类型 } qsort(num,100,sizeof(num[0]),cmp);
Cmp()定义了两个const void(类型为空)的指针*a和*b; 在*(int *)a - *(int *)b; 这句中把指针强制转换为 int型; 我们可以将const void 改为你需要排序对象的类型; int num[100]; int cmp ( int *a , int *b ) { return *a - *b; } qsort(num,100,sizeof(num[0]),cmp); 如果要对num[100]中的元素从大到小排序,只需要将return *a - *b改为 return *b -*a 就可以实现;
qsort简单实例
•
• • • • • • • • • • • • • • • • • • • • • • •
应用qsort对int数组进行排序:
#include #include int cmp_1 ( int *a , int *b ) { return *a - *b; } int cmp_2 ( int *a , int *b ) { return *b - *a; } void main() { int num[10]={1,3,5,7,9,2,4,6,8,0}; int i; qsort(num,10,sizeof(num[0]),cmp_1);//从小到大 for(i=0;i
C函数qsort的简介和用法
BY:SMJUN
C函数qsort实现快速排序
排序方法有很多种:选择排序,冒泡排序, 归并排序,快速排序等。 看名字都知道快速排序 是目前公认的一种 比较好的排序算法,比选择排序,冒泡排 序都要快。因为它的速度很快,所以系统 也在库里实现这个算法,便于我们的使用。 这就是qsort。
qsort简介
• qsort函数是ANSI C标准中提供的,其声明在 stdlib.h文件中,是根据二分发写的,其时间复杂 度为n*log(n),其结构为: • void qsort(void *base,size_t nelem,size_t width, cmp); • *base 为要排序的数组 • nelem 为要排序的数组的长度 • width 为数组元素的大小(一字节为单位) • 简单示例:对int num[100]排序,qsort中各参数 怎么写? • qsort(num,100,sizeof(num[0]),cmp);
自定义比较函数
• 比较函数的名字是自定义的(这里我们用CMP命名); • Cmp:qsort 要求提供的这个函数是一个需要自己定义的比较函 数,比较函数使得qsort通用性更好。有了比较函数qsort可以实 现对数组,字符串,结构体等结构进行升序或降序排序。 • Int Cmp(const void *a , const void *b )中有两个元素作为参数, 返回一个int值, 如果比较函数返回大于0,qsort就认为 a>b , 如果比较函数返回等于0 qsort就认为a 和b 这两个元素相等,返 回小于零 qsort就认为 ab),你比较函数却返 回一个 -1 (小于零的)那么qsort认为a
简单示例:对int num[100]中的元素从小到大排序。 int num[100]; int cmp ( const void *a , const void *b ) { return *(int *)a - *(int *)b; //强制转换类型 } qsort(num,100,sizeof(num[0]),cmp);
Cmp()定义了两个const void(类型为空)的指针*a和*b; 在*(int *)a - *(int *)b; 这句中把指针强制转换为 int型; 我们可以将const void 改为你需要排序对象的类型; int num[100]; int cmp ( int *a , int *b ) { return *a - *b; } qsort(num,100,sizeof(num[0]),cmp); 如果要对num[100]中的元素从大到小排序,只需要将return *a - *b改为 return *b -*a 就可以实现;
qsort简单实例
•
• • • • • • • • • • • • • • • • • • • • • • •
应用qsort对int数组进行排序:
#include #include int cmp_1 ( int *a , int *b ) { return *a - *b; } int cmp_2 ( int *a , int *b ) { return *b - *a; } void main() { int num[10]={1,3,5,7,9,2,4,6,8,0}; int i; qsort(num,10,sizeof(num[0]),cmp_1);//从小到大 for(i=0;i