一,qsort 底层使用的快速排序
void qsort(void*base,//待排序的起始地址
size_t num, //待排序数据的元素个数
size_t size, //待排序数据的一个元素的大小,单位是字节
int (*compar)(const void*,const void*)//函数指针,指向一个比较函数,这个函数是用来比较两个元素的
)
二,整形数组排序
1.代码思路
(1)main主函数
int main()
{
test1(); //整形数组排序
return 0;
}
(2)test()函数
void test1()
{
int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
//降序排为升序;
int sz = sizeof(arr) / sizeof(arr[0]);
printf_arr(arr, sz); //这是一个打印数组函数-排序前输出
my_sort(arr, sz, sizeof(arr[0]), my_compar_int);
printf_arr(arr, sz); //排序后输出
}
(3)输出打印函数
void printf_arr(int arr[], int sz)
{
for (int i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
putchar('\n');
}
(4)my_sort()函数
void my_sort(void* base, size_t num, size_t size, int(*compar)(const void* e1, const void* e2))
{
//冒泡排序的趟数,
int i = 0;
for (int i = 0; i < num - 1; i++)
{
//一趟冒泡排序
for (int j = 0; j < num - 1 - i; j++)
{
if (compar((char*)base + j * size, (char*)base + (j + 1) * size) >0)
{
//交换函数
swap((char*)base + j * size, (char*)base + (j + 1) * size, size);
}
}
}
}
(5)swap()交换函数
void swap(char* buf1, char* buf2, size_t size)
{
int i = 0;
for (int i = 0; i < size; i++)
{
char tmp = *buf1;
*buf1 = *buf2;
*buf2 = tmp;
buf1++;
buf2++;
}
}
(6)compar函数
int my_compar_int(const void*e1,const void*e2)
{
return *(int*)e1 - *(int*)e2;
}
2.完整代码
//打印数组函数
void printf_arr(int arr[], int sz)
{
for (int i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
putchar('\n');
}
//交换函数
void swap(char* buf1, char* buf2, size_t size)
{
int i = 0;
for (int i = 0; i < size; i++)
{
char tmp = *buf1;
*buf1 = *buf2;
*buf2 = tmp;
buf1++;
buf2++;
}
}
//定义qsort函数
void my_sort(void* base, size_t num, size_t size, int(*compar)(const void* e1, const void* e2))
{
//冒泡排序的趟数,
int i = 0;
for (int i = 0; i < num - 1; i++)
{
//一趟冒泡排序
for (int j = 0; j < num - 1 - i; j++)
{
if (compar((char*)base + j * size, (char*)base + (j + 1) * size) >0)
{
//交换函数
swap((char*)base + j * size, (char*)base + (j + 1) * size, size);
}
}
}
}
//int类型conmpar函数
int my_compar_int(const void*e1,const void*e2)
{
return *(int*)e1 - *(int*)e2;
}
//测试,打印整形数组
void test1()
{
int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
//降序排为升序;
int sz = sizeof(arr) / sizeof(arr[0]);
printf_arr(arr, sz);
my_sort(arr, sz, sizeof(arr[0]), my_compar_int);
printf_arr(arr, sz);
}
int main()
{
test1();
return 0;
}
3.打印结果
三,结构体数组排序(按字符串长度进行排列)
1.完整代码
//结构体类型
struct Stu
{
char name[20];
int age;
};
//结构体compar函数
int compar_stu_name(const void* e1, const void* e2)
{
return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
}
//定义qsort函数
void my_sort(void* base, size_t num, size_t size, int(*compar)(const void* e1, const void* e2))
{
//冒泡排序的趟数,
int i = 0;
for (int i = 0; i < num - 1; i++)
{
//一趟冒泡排序
for (int j = 0; j < num - 1 - i; j++)
{
if (compar((char*)base + j * size, (char*)base + (j + 1) * size) >0)
{
//交换函数
swap((char*)base + j * size, (char*)base + (j + 1) * size, size);
}
}
}
}
//测试,对结构体类型排序
void test2()
{
struct Stu arr[] = { {"zhangsan",20},{"lisi",30},{"wangwu",15} };
int sz = sizeof(arr) / sizeof(arr[0]);
my_sort(arr, sz, sizeof(arr[0]), compar_stu_name);
for (int i = 0; i < sz; i++)
{
printf("%s %d\n", arr[i].name,arr[i].age);
}
}
int main()
{
test2();
return 0;
}