qsort ()是可以实现不管是数字还是字符串快速排序的函数。
头文件:
#include <stdlib.h>
语法:
void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*))
base– 指向要排序的数组的第一个元素的指针。
nitems– 由 base 指向的数组中元素的个数。
size– 数组中每个元素的大小,以字节为单位。
compar– 用来比较两个元素的函数,即函数指针(回调函数)
如下:
qsort(num, 4, sizeof(num[0]),compare );
compar参数
compar参数指向一个比较两个元素的函数。比较函数的原型应该像下面这样。 注意两个形参必须是const void * 型 ,同时在调用compar 函数(compar实质为函数指针,这里称它所指向的函数也为compar)时,传入的实参也必须转换成const void *型。在compar函数内部会将const void *型转换成实际类型。
int compar(const void * p1, const void * p2);
如果compar返回值小于0(< 0),那么p1所指向元素会被排在p2所指向元素的左面;
如果compar返回值等于0(= 0),那么p1所指向元素与p2所指向元素的顺序不确定;
如果compar返回值大于0(> 0),那么p1所指向元素会被排在p2所指向元素的右面。
功能:
1.数字重排序
例如:
#include <stdio.h>
#include <stdlib.h>
int compare(const void* a, const void* b) {
return *(int*)b - *(int*)a;
}//从大到小排列
int main()
{
int num[4] = {3,9,1,4};
qsort(num, 4, sizeof(num[0]),compare );
for (int i = 0;i < 4;i++) {
printf("%d", num[i]);
}
}
int compare(const void* a, const void* b) {
return *(int*)a - *(int*)b;
}//从小到大排列
2.字符串重排序
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int compare(const void* p1, const void* p2) {
return strcmp((char*)p2, (char*)p1);
}
int main()
{
char str[] = "hello";
qsort(str, 5, sizeof(str[0]),compare );
printf("%s", str);
}
这里再另外介绍一下strcmp()函数
头文件:
#include <string.h>
语法:
int strcmp(const char* stri1,const char* str2);
返回值:
如果返回值 < 0,则表示 str1 小于 str2。
如果返回值 > 0,则表示 str2 小于 str1。
如果返回值 = 0,则表示 str1 等于 str2。
功能:比较两个字符串的大小
例如:
#include <stdio.h>
#include <string.h>
int main()
{
char str1[2] = "a";
char str2[2] = "b";
if (strcmp(str1, str2)>0) {
printf("%s大于%s", str1, str2);
}
if (strcmp(str1, str2) < 0) {
printf("%s大于%s", str2, str1);
}
else {
printf("%s等于%s", str2, str1);
}
}
使用该函数与冒泡法进行比较,代码量不一定有减少,但是运行速度会比冒泡快一些。
例如,以下用冒泡法进行数字排序:
#include <stdio.h>
int main()
{
int num[4] = { 3,9,1,4 };
int n;
for (int i = 0;i < 4;i++) {
for (int j = 0;j < 4;j++) {
if (num[j] < num[j + 1]) {
n = num[j];
num[j] = num[j + 1];
num[j + 1] = n;
}
}
}
for (int i = 0;i < 4;i++) {
printf("%d", num[i]);
}
}
用冒泡法进行字符串排序:
#include <stdio.h>
int main()
{
char str[] = "hello";
char n;
for (int i = 0;i < 4;i++) {
for (int j = 0;j < 4;j++) {
if (str[j] < str[j + 1]) {
n = str[j];
str[j] = str[j + 1];
str[j + 1] = n;
}
}
}
printf("%s", str);
}