qsort函数
qsort函数的定义为:
void qsort (void* base, size_t num, size_t size, int (compar)(const void,const void*));
这是c语言标准库中对qsort函数的定义,共有四个参数:
1)->void *base :是要排序的数组名(或者可以理解为数组首元素地址)
2)->size_t num :是数组元素个数,即要排序的元素个数
3)->size_t size :是元素类型大小,即数组是 int a[],则size = sizeof(int),以此类推
4)->int (*compar)(const void *,const void *) :这是一个函数指针,对应的函数是比较函数,返回值必须是int类型,在升序情况下:如果前面的数小于后面的数,此函数返回大于零的数,如果等于,此函数返回零,小于返回小于零的数。另外,因为此函数参数是void *,则在函数体内要对void * 进行强转,对 int 类型排序就强转为(int *).下面会有例子是实现:
本例子是使用冒泡排序的思想模拟实现qsort函数(准确的来说不是qsort()函数,因为在c语言库中qsort使用的是快速排序)
以下是模拟代码
#include<stdio.h>
#include<windows.h>
void swap(char *p1, char *p2, int size){//按字节交换,只要知道size的大小,对应交换几个字节就好了
while (size--){
char temp = *p1;
*p1 = *p2;
*p2 = temp;
p1++; p2++;
}
}
int Compar(const void *x, const void *y){//返回值必须是 int
int *xp = (int *)x;//强转
int *yp = (int *)y;
return (*xp - *yp);//大于的话就返回大于零的数,小于返回负数,等于返回零
}
void Myqsort(void* base, size_t num, size_t size, int(*compar)(const void*, const void*)){
size_t i = 0;//size_t是无符号整数,因为num是无符号数,所以i 和 j 也要定义为无符号数
for (; i < num - 1; i++){
size_t j = 0;
int flag = 0;
for (; j < num - i - 1; j++){
if (Compar((char *)base + j*size, (char *)base + (j + 1)*size) >0){//如果前面的大于后面的,就交换.....其余情况不交换(降序相反:只有小于零才交换)
swap((char *)base + j*size, (char *)base + (j + 1)*size, size);//交换
flag= 1;
}
if(flag == 0){//说明没有发生有效交换,意味着数组已经有序
break;
}
}
}
}
int main()
{
int arr[] = { 1, 15, 546, 21, 5, 6, 318, 34, 83, 4148, 97, 4 };
int size = sizeof(arr) / sizeof(arr[0]);
Myqsort(arr, size, sizeof(int), Compar);//调用模拟函数
int i = 0;
for (; i < size; i++){
printf("%d ",arr[i]);
}
system("pause");
return 0;
}```