目录
一、qsort函数的使用
快排函数qsort是C的库函数,它可以对输入的任何类型的数组排序,通过该函数的函数声明我们可以看出它的使用方法:
举个栗子:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int cmp1(const void* e1, const void* e2)
{
return *(int*)e1 - *(int*)e2;
}
int cmp2(const void* e1, const void* e2)
{
return *(char*)e1 - *(char*)e2;
}
int main()
{
int arr1[] = { 2,4,1,5,3,7 };
size_t num1 = sizeof(arr1) / sizeof(arr1[0]);
size_t sz1 = sizeof(arr1[0]);
char arr2[] = "kstnhmlw";
size_t num2 = strlen(arr2);
size_t sz2 = sizeof(char);
//整型数组排序
qsort(arr1, num1, sz1, cmp1);
for (size_t i = 0; i < num1; i++)
{
printf("%d ", arr1[i]);
}
printf("\n");
//字符型数组排序
qsort(arr2, num2, sz2, cmp2);
printf("%s\n", arr2);
return 0;
}
二、qsort函数的模拟
qsort函数最大的特点是对任意类型数组排序,要实现这一点只要采用和qsort函数声明一样的数据类型即可。在这里,qsort函数的排序方法我们使用冒泡排序。
//qsort函数的模拟
void Swap(char* n1, char* n2, size_t width)
{
//一个字节一个字节的交换
for (size_t i = 0; i < width; i++)
{
char tmp = *(n1 + i);
*(n1 + i) = *(n2 + i);
*(n2 + i) = tmp;
}
}
void my_qsort(void* base, size_t num, size_t width, int (*cmp)(const void* e1, const void* e2))
{
size_t i = 0;
size_t j = 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) > 0)
{
Swap((char*)base + j * width, (char*)base + (j + 1) * width, width);
}
}
}
}