前言:后面还有模仿qsort函数的冒泡排序实现哦
在编写程序的过程中有很多排序算法,有冒泡排序,归并排序,还有今天的主角核心快速排序,这么快的算法,c语言中也为我们提供了这个函数qsort。听名字就是什么,就是一个字 ” 快!“,没错它是目前公认的最快的排序算法,这就是它的名字来源(说不定以后有更快的排序算法,这个快速排序就叫第二快排序算法,也不是没有可能)哈哈哈哈哈,开句玩笑,述说简短,我们这就开始正式介绍这个C语言为我们提供的快速排序函数qsort函数。
qsort函数简介
需要引用的头文件#include <stdlib.h>
功能:
使用快速排序例程进行排序。
函数声明:
void qsort(void *base, size_t nitems, size_t size, int (*compare)(const void *, const void*))
这里补充一下什么是void*: void *,任何类型的指针都可以直接赋值给它,无需进行强制类型转换,void
*也可以无需强制类型转换地赋给其它类型的指针。因为“无类型”可以包容“有类型”,而“有类型”则不能包容“无类型”。
①:base–> 是指向要排序的数组的第一个元素的指针。注意这里说是数组,所以必须是对连续的内存块进行排序。
②:nitems–> base指向数组的元素个数。
③:size–> 每各元素的大小
④:compare–> 指向函数的指针,指向函数的指针,指向函数的指针,重要的事情说3遍。(需要再定义一个比较函数),为什么需要在定义一个比较函数呢,如果这样一个快速排序的函数你用着很舒服很方便,你甘心只能用于一种类型的数据排序吗,所以再定义一个比较函数可以快速排序任何类型,比如结构体,数组,字符串,这样就会非常方遍,通用性得到了优化。
比较函数:
刚才我们说到了需要用户自己来定义一个比较函数,那么这个比较函数该如何来进行定义呢,请看。
int cmp(const void *S1, const void *S2);
为了通用性我们还是用void类型,注意const修饰是在‘ * ’号前,不是在‘ * ’号后。
举例int类型
#include <stdio.h>
#include <stdlib.h>
int cmp_int(const void* S1, const void* S2)//创建的比较函数
{
return *(int*)S1 - *(int*)S2;//函数比较
}
int main()
{
int arr[10] = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
int len = sizeof(arr) / sizeof(arr[0]);
qsort(arr, len, sizeof(arr[0]), cmp_int);//升序数组
int i = 0;//下面是打印数组
for (i = 0; i < len; i++)
{
printf("%d", arr[i]);
}
printf("\n");
return 0;
}
举例结构体类型
struct sum
{
char name[20];//创建结构体
int id;
};
int cmp_struct_name(const void* s1, const void* s2)//创建比较函数
{
return strcmp(((struct sum*)s1)->name, ((struct sum*)s2)->name);//因为我们比较的是两个字符串,所以我们用到这个字符串比较函数。
}
int main()
{
struct sum arr[3] = { { "zhang", 1996 }, { "wang", 2000 }, { "li", 1960 } };
int len = sizeof(arr) / sizeof(arr[0]);
qsort(arr, len, sizeof(arr[0]), cmp_struct_name);//按姓名比较
return 0;
}
模仿实现qsort函数冒泡排序:
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
int cmp_int(const void* S1, const void* S2)
{
return *(int*)S1 - *(int*)S2;
}
void swap(char* num1, char* num2, int size)
{
int i = 0;
char tmp = 0;
for (i = 0; i < size; i++)
{
tmp = *num1;
*num1 = *num2;
*num2 = tmp;
num1++;
num2++;
}
}
void my_qsort(void* base, int len, int size, int(*cmp)(const void* s1, const void* s2))
{
int i = 0;
int j = 0;
for (i = 0; i < len; i++)
{
for (j = 0; j < len - i - 1; j++)
{
if (cmp( (char*)base+j * size, (char*)base + (j + 1) * size))//两个元素比较
{
swap((char*)base + j*size, (char*)base + (j + 1)*size, size);//交换
}
}
}
}
int main()
{
int arr[10] = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
int len = sizeof(arr) / sizeof(arr[0]);
my_qsort(arr, len, sizeof(arr[0]), cmp_int);
int i = 0;
for (i = 0; i < len; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
感谢收看。结束。