目录
1. qsort是什么?
2. 为什么要使用qsort
3. qsort的使用
3.1 qsort的返回值和参数
3.2 qsort的compare函数参数
3.3 int类型数组的qsort完整代码
4. qsort完整代码
1. qsort是什么?
qsort中的q在英语中是quick,快速的意思了,sort就是排序,故名为快速排序
2. 为什么要使用qsort
它和冒泡排序都能帮助我们排好序,为什么要使用快速排序
因为它快速,在数据量很大的时候我们用快速排序的效率是非常高的
并且它不仅可以用于计算机的内置类型(int、double、float、char......)
而且还可以用于自己定义的类型(结构体、枚举......)
3. qsort的使用
首先,要想使用qsort需要包含头文件 stdlib.h,然后就可以使用了
先来看看qsort的返回值和参数
3.1 qsort的返回值和参数
base为你要排序数组的首地址,类型为void*
因为qsort的开发人员并不知道你需要排序的是一个整型数组还是浮点型数组还是字符串,
所以这个指针不能写死为某一个类型,而是用来void*,void* 可以用来接受任何的类型,但它不能进行加减或者解引用运算,有利有弊
num为需要排序数组的大小,类型为size_t,无符号整型,大小只能为正或0不能为负
size为数组一个元素的字节大小,类型为size_t,也是只能为正或0不能为负
最后一个compar为一个函数指针,函数返回值为int类型,里面的参数是两个const void*
compare是用来比较两个数字(字符)的大小,从而进行排序
如果对这个参数不是很了解可以看看我之前写的文章有写到函数指针和函数指针数组
C语言:指针的进阶讲解-CSDN博客
3.2 qsort的compare函数参数
这个compare函数是需要我们自己写的,是的,就是这么麻烦,但是熟悉之后这个函数很容易就能写的出来
因为创造者并不知道我们需要排的是个什么数组,只有我们使用者才知道,所以创造者只能用你给的一些参数的信息来使用qsort进行排序
int Compare(const void* a, const void* b)
{return *(int*)a - *(int*)b;
}
这是一个用于排序整型的compare函数
首先要写出这个函数我们的返回值和参数必须要跟它需要的一样
我们要比较两个数字的大小,那么我们首先要对这两个void类型的指针解引用拿到地址里面的值才能进行比较,最后返回一个正数或者负数
但是我们知道void* 是不能进行解引用操作的,所以我们必须得要先把这两个参数强制类型转换为int* 然后才能进行解引用操作拿到里面的值最后进行比较返回正数或者负数即可
3.3 int类型数组的qsort完整代码
#include <stdio.h>
#include <stdlib.h>void Print(int* arr, int n)
{for (int i = 0; i < n; i++){printf("%d ", arr[i]);}
}int Compare(const void* a, const void* b)
{return *(int*)a - *(int*)b;
}int main()
{int arr[] = { 1,4,5,7,2,3,6,9,8,0 };int sz = sizeof(arr) / sizeof(arr[0]);qsort(arr, sz, sizeof(arr[0]), Compare);Print(arr, sz);return 0;
}
3.4 char类型数组的qsort完整代码
字符compare也是类似,但还是有很多细节要改变
#include <stdio.h>
#include <stdlib.h>
#include <string.h>void Print(char* arr, int n)
{for (int i = 0; i < n; i++){printf("%c ", arr[i]);}
}int Compare(const void* a, const void* b)
{return strcmp((char*)a, (char*)b);
}int main()
{char arr[] = "bdeafcg";int sz = strlen(arr);qsort(arr, sz, sizeof(arr[0]), Compare);Print(arr, sz);return 0;
}
首先我们需要引用string.h头文件使用一些关于字符串操作的函数
数组个数sz的计算不能是前面整型的那种方式了,需要用库函数strlen计算数组大小
在比较函数里需要使用strcmp比较两个字符,这里面不需要解引用,因为这个strcmp的两个参数都是需要指针,所以传地址即可
qsort甚至还可以用于结构体
具体需要可以看以下完整代码
4. qsort完整代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>typedef struct student
{char name[20];int age;
}STU;int compare1(void* a, void* b)
{return *(int*)a - *(int*)b;
}int compare2(void* a, void* b)
{return strcmp((char*)a, (char*)b);
}int compare3(void* a, void* b)
{return *(float*)a - *(float*)b;
}int compare4(void* a, void* b)
{return strcmp(((STU*)a)->name, ((STU*)b)->name);
}int compare5(void* a, void* b)
{return ((STU*)a)->age - ((STU*)b)->age;
}void print1(int* arr, int n)
{for (int i = 0; i < n; i++){printf("%d ", arr[i]);}
}void print2(char* arr, int n)
{for (int i = 0; i < n; i++){printf("%c ", arr[i]);}
}void print3(float* arr, int n)
{for (int i = 0; i < n; i++){printf("%.2f ", arr[i]);}
}void print4(STU* arr, int n)
{for (int i = 0; i < n; i++){printf("%s ", arr[i].name);}
}void print5(STU* arr, int n)
{for (int i = 0; i < n; i++){printf("%d ", arr[i].age);}
}void test1()
{int arr[] = { 9,6,3,5,8,2,1,7,4 };int sz = sizeof(arr) / sizeof(arr[0]);qsort(arr, sz, sizeof(arr[0]), compare1);print1(arr, sz);
}void test2()
{char arr[] = "fdghabce";int sz = strlen(arr);qsort(arr, sz, sizeof(arr[0]), compare2);print2(arr, sz);
}void test3()
{float arr[] = { 1.1,0.5,3.14,9.4,10.5,1.7 };int sz = sizeof(arr) / sizeof(arr[0]);qsort(arr, sz, sizeof(arr[0]), compare3);print3(arr, sz);
}void test4()
{STU arr[] = { {"zhangsan", 26}, {"lisi", 56}, {"wangwu", 18} };int sz = sizeof(arr) / sizeof(arr[0]);qsort(arr, sz, sizeof(arr[0]), compare4);print4(arr, sz);
}void test5()
{STU arr[] = { {"zhangsan", 26}, {"lisi", 56}, {"wangwu", 18} };int sz = sizeof(arr) / sizeof(arr[0]);qsort(arr, sz, sizeof(arr[0]), compare5);print5(arr, sz);
}int main()
{//test1();//test2();//test3();//test4();test5();return 0;
}
完
感谢观看