qsort是一个快速排序的函数,这次模拟的是可以给不同类型的数据进行从小到大的排序。
函数第一个参数void* base是传的数组(可以是int,也可以是char),第二个参数int num是数组的元素个数,第三个参数int width是数组的一个元素的大小,第四个函数int cmp(void*,void*)是回调函数。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
void swap(char* a,char* b)
{
*a = *a ^ *b; //通过相互异或来交换,也可创立变量来交换
*b = *b ^ *a;
*a = *b ^ *a;
}
int cmp(const void* str1,const void* str2)
{
char* a = (char*)str1; //把两个指针强转为char*类型
char* b = (char*)str2;
if (*a > *b) //根据比较大小不同返回不同的值
{
return 1;
}
else if (*a < *b)
{
return -1;
}
else
{
return 0;
}
}
void Myqsort(void* base, int num, int width,int cmp(void* ,void*))
{
assert((char*)base); //断言base不是空
int i = 0;
int j = 0;
int flag = 0;
for (i = 0; i < num - 1; i++)
{
for (j = 0; j < num - 1 - i; j++)
{
if ((cmp((char*)base + j*width, (char*)base + (j + 1)*width)) == 1)
{ //把参数强转为char*类型,然后指针后面加上第j个数 * 数组中一个元素的大小,整体相当于指针指向第j个数
swap((char*)base+j*width, (char*)base + (j+1)*width);
flag = 1;
}
}
if (0 == flag) //如果flag == 0,说明flag没有变成1,说明没有进入if
{ //说明没有交换,说明数组已经是顺序的了,则不需要再检索的了
break;
}
}
}
int main()
{
int arr[] = {1,9,2,8,3,7,4,6,5};
int num = sizeof(arr) / sizeof(arr[0]);
int width = sizeof(arr[0]);
Myqsort(arr, num, width, cmp);
int i = 0;
for (i = 0; i < num; i++)
{
printf("%d ", arr[i]);
}
/*char arr[] = "gfedcba";
int num = strlen(arr);
int width = sizeof(arr[0]);
Myqsort(arr, num, width, cmp);
printf("%s\n", arr);*/
system("pause");
return 0;
}