快速排序
在实现快速排序之前我们要先知道快速排序是什么。简单说其实就是可以排序各种类型的数据,比如整型,结构体等等都可以,我们这里是用冒泡排序去写的,因为目前也只学习了冒泡排序哈,后面会再有其他版本的,
这里我们看到qsort有4个参数,下面一一来解释。
基本使用
值得注意的是我们要自己实现一个比较函数,至于为什么是因为写qsort函数的人也不知道使用者要用来比较什么,又或者大到小或者小到大排序,所以需要我们自己去实现一个比较函数,因为使用者知道自己要比较的数据是什么类型的。
参数解释
qsort函数第一个参数是要比较数组的起始地址,第二个参数是数组元素个数,第三个参数是每个元素大小,第四个参数是比较函数。 ‘
模拟实现
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> //这里整型是这样写的,但是比较其他数据就会变哈 int cmp_int(const void* e1,const void* e2) { return (*(int*)e1 - *(int*)e2); } //打印函数 void Print(int arr[],int sz) { int i = 0; for (i = 0; i < sz; i++) { printf("%d ",arr[i]); } } //交换函数 void swap(void* p1, void* p2, size_t width) { int i = 0; //因为要交换这么多长度次,所以要for循环 for (i = 0; i < width; i++) { char tmp = *((char*)p1 + i); *((char*)p1 + i) = *((char*)p2 + i); *((char*)p2+i) = tmp; } } void bubble_qsort(void* base, size_t num, size_t width, int(* cmp)(const void* e1, const void* e2)) { int i = 0; int j = 0; for (i = 0; i < num; i++) { for (j = 0; j < num-i-1; j++) { //强制类型转换为char* 这里加上j*width值得注意 if (cmp((char*)base + j*width, (char*)base + (j + 1)*width)>0) swap((char*)base + j * width, (char*)base + (j + 1) * width,width); } } } int main() { int arr[] = { 1,3,2,5,7,9,8,4,6 }; int sz = sizeof(arr) / sizeof(arr[0]); //qsort(arr, sz, sizeof(int), cmp_int); bubble_qsort(arr, sz, sizeof(int), cmp_int); Print(arr, sz); return 0; }
首先我们要注意的是参数类型都是void* 的,为的就是更好得去使用,因为作者是不知道我们要使用时是用什么类型。
再就是在内部转换成char* 类型,这样就可以一个字节一个字节去比较和交换。
这里的实现bubble_qsort函数要注意的是两个for循环一个是小于num,一个是小于num-i-1,就是总趟数,还有一个是每个元素要比较的次数,这个和冒泡排序是一样的。
今天的内容就到这里了哈!!!
要是认为作者有一点帮助你的话!
就来一个点赞加关注吧!!!当然订阅是更是求之不得!
赠人玫瑰,手有余香=。=!
最后的最后感谢大家的观看!!!
你们的支持是作者写作的最大动力!!!
下期见哈!!!