各位大佬,即使是国庆也不要忘了学习呦,所以今天我要介绍的就是qsort函数。
qsort函数是c语言标准库里的函数,它可以用来排序各种类型的数据,比如:int类型、结构体类型、char类型等等。
那么他是如何使用的呢?请看下文:
qsort相关头文件:#include<stdlib.h>。在使用qsort函数之前先引入头文件。
函数原型:void qsort (void* base, size_t num, size_t size, int (*compar)(const void*,const void*));
我们可以观察到qsort的返回类型为空,更重要的是他的第一个参数是void*,这就意味着我们可以传入任何类型的数据。从而可以给各种类型的数据排序。而后面的num表示的是要排序的元素个数,size表示每一个元素的大小。
那么 int (*compar)(const void*,const void*)表示什么呢?
他表示的是我们自己设计的判断数据大小的函数。因为qsort函数的设计者是不知道我们用到qsort函数的时候传入的是什么类型的数据。比如说:我们要比较两个int类型的数据的大小可以通过返回相减的结果是否大于0来判断大小,而char类型就不能这样判断。因此为了能够实现所有数据的排序,判断数据大小的函数需要我们自己去编写。
下面是compar函数的返回类型,若返回的值小于0,则a小于b、等于0,a,b相等、大于0,a大于b。
下面就给大家看看利用qsort来实现各种类型的排序。(int、char、结构体)
int类型:
//1、整型实现
int cmp_int(const void* e1,const void* e2)
{
return (*(int*) e1 - *(int*) e2);
}
int main()
{
int arr[] = { 1,5,2,3,4,8,6,9,7 };
int sz = sizeof(arr) / sizeof(arr[0]);
qsort(arr, sz, sizeof(int), cmp_int);
for(int i = 0;i<sz;i++)
{
printf("%d ", arr[i]);
}
return 0;
}
int类型的大小比较相对简单(上面也提到),我们直接返回两个数据相减的结果
char类型:
//字符串
int cmp_char(const void* e1,const void* e2)
{
return strcmp((char*)e1, (char*)e2);
}
int main()
{
char arr1[] = "edcba";
//char arr2[] = "abcdefg";
int sz = strlen(arr1);
qsort(arr1,sz, sizeof(char), cmp_char);
printf("%s ", arr1);
return 0;
}
结构体类型:
//结构体比较大小
//姓名
struct peop
{
char name[20];
int age;
};
int cmp_stu_name(const void* e1,const void* e2)
{
return strcmp(((struct peop*)e1)->name, ((struct peop*)e2)->name);
}
int main()
{
struct peop p1[] = { "zhangsan",18,{"shangsi",19} };
int sz = sizeof(p1) / sizeof(p1[0]);
qsort(p1,sz, sizeof(struct peop), cmp_stu_name);
return 0;
}
//年龄
int cmp_stu_age(const void* e1,const void* e2)
{
return ((struct peop*)e1)->age - ((struct peop*)e2)->age;
}
int main()
{
struct peop p1[] = { "zhangsan",18,{"shangsi",19} };
int sz = sizeof(p1) / sizeof(p1[0]);
qsort(p1, sz, sizeof(struct peop), cmp_stu_age);
return 0;
}
下面我们就使用冒泡排序模拟实现qsort。
#include<stdio.h>
void Swap(char* buf1, char* buf2, int size)
{
int i = 0;
for (i = 0; i < size; i++)
{
char tmp = *buf1;
*buf1 = *buf2;
*buf2 = tmp;
buf1++;
buf2++;
}
}
void bubble_qsort(void* base, size_t num, size_t size, int (*com)(const void*, const void*))
{
for(int i = 0;i<num-1;i++)
{
for(int j = 0;j<num-1-i;j++)
{
if(cmp((char*)base+j*size,(char*)base+(j+1)*size)>0)
{
swap((char*)base + j * size, (char*)base + (j + 1) * size,size);
}
}
}
int cmp_int(const void* e1, const void* e2)
{
return (*(int*)e1 - *(int*)e2);
}
void print(int arr[], int sz)
{
for (int i = 0; i < sz; i++)
{
printf("%d", arr[i]);
}
}
void test4()
{
int arr[] = { 2,1,3,7,5,9,6,8,0,4 };
int sz = sizeof(arr) / sizeof(arr[0]);
bubble_qsort(arr, sz, sizeof(arr[0]), cmp_int);
print(arr, sz);
}
int main()
{
test4();
return 0;
}
ok,这就是我们今天所有的内容了,感谢大家的阅读!!!
若有错误请大佬指正!