目录
今天我用qsort函数来实现不同数据类型的排序:
一.最重要的是需要介绍qsort函数的内容及参数解释:
qsort函数--用来排序的库函数
qsort可以排序任意类型的数据
void qsort(void* base, //指针,指向的是待排序数组的第一个元素
size_t num //是base指向的待排序数组的元素的个数
size-t size //base指向的待排序数组的元素大小
int (compar)(const void*,const void*)) //函数指针——指向的是两个元素的比较函数
二.先从最简单的开始——整型数据的排序
//qsort排序整数
int compare(const void* p1, const void* p2)
{
return *(int*)p2 - *(int*)p1; //(void*)强制转换为(int*)
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int sz = sizeof(arr) / sizeof(arr[0]);
qsort(arr, sz, sizeof(arr[0]), compare);
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
三.字符型数据也就大同小异了
//qsort排序字符
int compare(const void* p1, const void* p2)
{
return *(char*)p2 - *(char*)p1; //(void*)强制转换为(char*)
}
int main()
{
char arr[] = { 'a','b','c','d','e','f' };
int sz = sizeof(arr) / sizeof(arr[0]);
qsort(arr, sz, sizeof(arr[0]),compare);
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%c ", arr[i]);
}
return 0;
}
四.结构体型数据排序
//qsort排序结构体
struct stu
{
char name[20];
int age;
};
int compare(const void* p1, const void* p2)
{
return strcmp(((struct stu*)p1)->name,((struct stu*)p2)->name);
//字符串之间的比较用strcmp
//strcmp是按照对应着字符串中的字符的ascii码值比较
}
void test()
{
struct stu arr[3] = { {"zhangsan",18},{"lisi",19},{"wangwu",20} };
int sz = sizeof(arr) / sizeof(arr[0]);
qsort(arr, sz, sizeof(arr[0]),compare);
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%s ",arr[i].name);
}
}
int main()
{
test();
return 0;
}
五.冒泡排序模拟实现qsort函数
#include <stdio.h>
#include <string.h>
void Swap(char* p1, char* p2, size_t size)
{
int i = 0;
for (i = 0; i < size; i++)
{
char tmp = *(p1 + i);
*(p1 + i) = *(p2 + i);
*(p2 + i) = tmp;
}
}
void bubble_sort(void* base, size_t sz, size_t width, int (*cmp)(const void* p1,const void* p2))
{
int i = 0;
//趟数
for (i = 0; i < sz - 1; i++)
{
//每一趟冒泡排序的过程
int j = 0;
for (j = 0; j < sz - 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);
}
}
}
}
struct stu {
char name[20];
int age;
};
int cmp_struct_by_name(const void* p1, const void* p2)
{
return strcmp(((struct stu*)p1)->name, ((struct stu*)p2)->name);
}
int cmp_struct_by_age(const void* p1, const void* p2)
{
return ((struct stu*)p1)->age - ((struct stu*)p2)->age;
}
void test1()
{
struct stu arr[] =
{
{"zhangsan" , 32},
{"lisi", 18},
{"xiaoming", 34}
};
bubble_sort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(arr[0]), cmp_struct_by_name);
//bubble_sort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(arr[0]), cmp_struct_by_age);
int i = 0;
for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
{
printf("%s %d\n", arr[i].name, arr[i].age);
}
}
int main()
{
test1();
return 0;
}
最终的运行结果: