1、C语言标准库函数 qsort(快速排序)
声明在stdlib.h文件中,时间复杂度为n*log(n)
void qsort( void *base(需要排序的目标数组名), size_t num(参与排序的目标数组元素个数), size_t width(单个元素的大小(或者目标数组中每一个元素长度),推荐使用sizeof(s[0])这样的表达式), int (__cdecl *compare (比较函数))
int compare (const void *elem1, const void *elem2 ) );(返回值必须是int,两个参数的类型必须都是const void *)
对int类型数组进行排序
int num[100];
int cmp ( const void *a , const void *b )
{
return *(int *)a - *(int *)b; //升序排序,在这句话里 a,b肯定是一个指针变量(int *)a是表示把a强制转换成一个int型的指针。如果以前a是char型,编译器会认为a指向的那一个字节的内存单元是a里面的东西把a转换成int型,编译器会认为a指向的连续四个字节里的东西都是a里面的。*(int *)a就是取a指向的内容的意思,跟*a的那个*作用一样
//return *(int *)b - *(int *)a; //降序排序
/*可见:参数列表是两个空指针,现在他要去指向你的数组元素。所以转型为你当前的类型,然后取值。
升序排列时,若第一个参数指针指向的“值”大于第二个参数指针指向的“值”,则返回正;若第一个参数指针指向的“值”等于第二个参数指针指向的“值”,则返回零;若第一个参数指针指向的“值”小于第二个参数指针指向的“值”,则返回负。
降序排列时,则刚好相反。
*/
}
qsort(s,n,sizeof(s[0]),cmp);
eg:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#pragma warning(suppress : 4996)//解决警告
int s[10000], n, i;
int cmp(const void* a, const void* b)
{
return(*(int*)b - *(int*)a); //实现的是降序排序
}
int main()
{
// 输入想要输入的数的个数
scanf_s("%d", &n);
for (i = 0; i < n; i++)
scanf_s("%d", &s[i]);//一个一行的输入要比较的数字
qsort(s, n, sizeof(s[0]), cmp);
for (i = 0; i < n; i++)
printf("%d ", s[i]);
return(0);
}
以上摘取总结自:qsort函数、sort函数 (精心整理篇) - JokerSmithWang - 博客园 (cnblogs.com)
2、
标签:const,指向,int,void,qsort,学习,日记,指针 From: https://www.cnblogs.com/zhishiyigenicheng/p/16786255.html