注意;
这里模拟是用冒号排序实现,qsort是用快速排序实现排序
简单介绍一下qsort含数
qsort是stdlib.h中的函数,因此使用前需要声明:
qsort函数包含四个参数,分别是:
1.数组名
2.元素个数(从前往后计算)
3.数组元素所占字节(int,double,char等所占字节)
4.排序原则
qsort(num, n, sizeof(int), cmp);
模拟qsort函数
好,那我们模拟它就从这四个参数下手,顺便补充一下,排序原则是返回正负数来判断元素大小的
#include<stdio.h>
float cmp(const void* p1, const void* p2)//有什么需求就写相对应类型的函数
{
return *(float*)p1 - *(float*)p2;//因为你参数为void*类型,所以需要强制转换你所需类型
}
void Swap(char* pa1, char* pa2, size_t wide)//交换元素的函数
{
size_t i;
for (i = 0; i < wide; i++)//一个一个字节慢慢换
{
char tem = *pa2;
*pa2 = *pa1;
*pa1 = tem;
pa1++;
pa2++;
}
}
//size_t意思是无符号整形
void qsort_t(void*arr, size_t sz,size_t wide, float cmp(const void*,const void*))//void*就像垃圾桶,什么类型都能接收
{
size_t i= 0;
size_t j;
for ( i = 0; i < sz; i++)
{
for (j = 0; j < sz - 1; j++)//这里核心是wide用法,好比你传进来是int arr[0]是4个字节
//但我把你转换成一个字节类型(char)的指针乘以arr[0]的宽度4
// 那么解引用(char*)arr + j * wide的地址依旧是arr[0]的元素,j=0
//为什么要转换,因为我们要用多种类型,如果不这样做,那运用范围就小了
{
if (cmp((char*)arr + j * wide, (char*)arr + (j+1) * wide )<0)//判断返回值大小
{
Swap((char*)arr + j * wide, (char*)arr + (j + 1) * wide,wide);
}
}
}
}
int main()
{
float arr[] = { 3.10,2.80,4.60,1.10,5.50 };
size_t sz = sizeof(arr) / sizeof(arr[0]);
size_t wide = sizeof(arr) / sz;
qsort_t(arr, sz, wide, cmp);
for (size_t p = 0; p < sz; p++)
{
printf("%f ", arr[p]);
}
return 0;
}
这里用两组不同类型数组测试了下
效果看来没问题