qsort函数是库函数中的一员,我们先来看看官方文档是怎么写的:

其中qsort的参数void* base是传入一个数组,size_t num 为数组整体大小,size_t size 为单个元素的大小,int (*compar)(const void*,const void*)是需要使用者去完成的一个比较函数

针对这个函数,在不同类型的数组中需要用不同的处理方式,来保证数组中的元素大小不会失真(例如在处理double型的数组时就需要用不同的方式来进行)

比较函数的返回值是;

return value meaning
<0 The element pointed to by p1 goes before the element pointed to by p2
0 The element pointed to by p1 is equivalent to the element pointed to by p2
>0 The element pointed to by p1 goes after the element pointed to by p2

我们来看一个例子:这是官方文档为我们提供的一个例子:关于对 qsort 的使用

 /* qsort example */
#include <stdio.h> /* printf */
#include <stdlib.h> /* qsort */ int values[] = { , , , , , }; int compare (const void * a, const void * b)
{
return ( *(int*)a - *(int*)b );
} int main ()
{
int n;
qsort (values, , sizeof(int), compare);
for (n=; n<; n++)
printf ("%d ",values[n]);
return ;
}

1.对 int 类型的数组排序

 //qsort函数
#include <stdio.h>
#include<stdlib.h>
//qsort函数实现int型排序
//qosrt函数的使用者得实现一个比较函数
int int_cmp(const void * p1, const void * p2)
{
return (*( int *)p1 - *(int *) p2);
} int main()
{
int arr[] = { , , , , , , , , , };
qsort(arr, sizeof(arr) / sizeof(arr[]), sizeof(int), int_cmp);
for (int i = ; i < sizeof(arr) / sizeof(arr[]); i++)
{
printf("%d ", arr[i]);
}
printf("\n");
return ;
}

2.对 char 类型的数组排序

 //qosrt函数实现char型排序
#include<stdio.h>
#include<stdlib.h>
int char_cmp(const void* str1, const void* str2)
{
return *(char*)str1 - *(char*)str2;
} int main()
{
char str[] = { , , , , , , , , , };
qsort(str, sizeof(str) / sizeof(str[]), sizeof(char), char_cmp);
for (int i = ; i < sizeof(str) / sizeof(str[]); ++i)
{
printf("%d ", str[i]);
} return ;
}

3.对 double 类型数组排序(需要特别注意)

 //qosrt函数实现double型排序
#include<stdio.h>
#include<stdlib.h>
int double_cmp(const void* arr1, const void* arr2)
{
return *(double*)arr1 > *(double*)arr2 ? : -;
//注意这里是用比较大小的方法,来返回正负
} int main()
{
double arr[] = { 1.4, 3.9, 5.4, 5.2, , , , , , };
qsort(arr, sizeof(arr) / sizeof(arr[]), sizeof(double), double_cmp);
for (int i = ; i < sizeof(arr) / sizeof(arr[]); ++i)
{
printf("%f ", arr[i]);
} return ;
}

4.对结构体一级排序

 #include<stdio.h>
#include<stdlib.h> typedef struct Student
{
int x;
int y;
//按照x从小到大排序,当x相等时按照y从大到小排序
}Student; Student student[]; int cmp(const void *a, const void *b)
{
Student* pa1 = (Student*)a;
Student* pa2 = (Student*)b; return (pa1->x) > (pa2->x) ? : -;
} //展示一下对于结构体里赋值的后的结果
void Display()
{
for (int i = ; i < ; ++i)
{
printf("%d\n",student[i].x);
}
} int main()
{
int arr[] = { ,,,,,, };
for (int i = ; i < ; ++i)
{
//将数组arr中的元素赋值给结构体x中
student[i].x = arr[i];
}
Display();
qsort(student, , sizeof(Student), cmp);
for (int i = ; i < ; ++i)
{
printf("%d", student[i].x);
} return ;
}

5.对机构体二级的排序

就对于4中的结构体来说,如果给x赋值,则x中的值都为0,那么就需要来比较y中的数组。

则可以将代码改为下面这样:

 #include<stdio.h>
#include<stdlib.h> typedef struct Student
{
int x;
int y;
//按照x从小到大排序,当x相等时按照y从大到小排序
}Student; Student student[]; int cmp(const void *a, const void *b)
{
Student* pa1 = (Student*)a;
Student* pa2 = (Student*)b; if (pa1->x != pa2->x)
{
return (pa1->x) > (pa2->x) ? : -;
}
else
{
return (pa1->y) > (pa2->y) ? : -;
}
} //展示一下对于结构体里赋值的后的结果
void Display()
{
printf("x=");
for (int i = ; i < ; ++i)
{
printf("%d", student[i].x);
}
printf("\n");
printf("y=");
for (int i = ; i < ; ++i)
{
printf("%d", student[i].y);
}
printf("\n");
} int main()
{
int arr[] = { ,,,,,, };
for (int i = ; i < ; ++i)
{
//将数组arr中的元素赋值给结构体x中
student[i].y = arr[i];
}
Display();
printf("排序结构体中的y:\n");
qsort(student, , sizeof(Student), cmp);
for (int i = ; i < ; ++i)
{
printf("%d", student[i].y);
} return ;
}

6.模仿qsort的功能实现一个通用的冒泡排序

 //用回调函数模拟实现qsort(冒泡排序的方式)

 #include <stdio.h>

 int int_cmp(const void * p1, const void * p2)
{
return (*(int *)p1 > *(int *)p2);
} void _swap(void *p1, void * p2, int size)
{
int i = ;
for (i = ; i < size; i++)
{
char tmp = *((char *)p1 + i);
*((char *)p1 + i) = *((char *)p2 + i);
*((char *)p2 + i) = tmp;
}
} void bubble(void *base, int count, int size, int(*cmp)(void *, void *))
{
int i = ;
int j = ;
for (i = ; i < count - ; i++)
{
for (j = ; j < count - i - ; j++)
{
if (cmp((char *)base + j * size, (char *)base + (j + )*size) > )
{
_swap((char *)base + j * size, (char *)base + (j + )*size, size);
}
}
}
}
int main() {
int arr[] = { , , , , , , , , , };
//char *arr[] = {"aaaa","dddd","cccc","bbbb"};    
int i = ;
bubble(arr, sizeof(arr) / sizeof(arr[]), sizeof (int), int_cmp);
for (i = ; i< sizeof(arr) / sizeof(arr[]); i++)
{
printf( "%d ", arr[i]);
}
printf("\n");
return ;
}

最新文章

  1. mysql半同步(semi-sync)源码实现
  2. Kinect之彩色图像数据
  3. nginx日志分割脚本
  4. 创建mysql 存储过程
  5. opsview
  6. hdu 4705 dfs统计更新节点信息
  7. 自己的缺省(sheng)源
  8. PHP批量审核ajax jquery
  9. Github错误:Failed to publish this branch
  10. SQLServer 中实现类似MySQL中的group_concat函数的功能
  11. ES5规范之Object增强
  12. iOS UICollectionView(转二)
  13. 初识Redis系列之四:.net使用Redis存储数据
  14. Struts中的找不到StringUtils异常
  15. Django与Ajax
  16. Springboot中的事件Event
  17. can 网络管理
  18. [杂谈]杂谈章1 问几个JAVA问题
  19. OOM异常的4种可能分析
  20. 线程 day40

热门文章

  1. 性能测试的过程(jmeter)
  2. https 适配
  3. springboot aop 不生效原因解决
  4. Python自学:第三章 修改列表元素
  5. 『PyTorch』第五弹_深入理解Tensor对象_中下:数学计算以及numpy比较_&amp;_广播原理简介
  6. python----操作文本文件
  7. [hdu P3085] Nightmare Ⅱ
  8. 记不住的Android活动的生命周期
  9. kali-rolling安装使用sonarqube教程(docker方式)
  10. Eclipse+Maven+Scala Project+Spark | 编译并打包wordcount程序