之前我们学习过冒泡排序:
int main()
{
int arr[] = { 9,7,8,6,5,4,3,2,1,0 };
int sz = sizeof(arr)/sizeof(arr[0]);
int i = 0;
for (i = 0; i < sz-1; i++) {
int j = 0;
for (j = 0; j < sz-1-i; j++) {
if (arr[j] > arr[j + 1])
{
int temp = 0;
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
for (i = 0; i < sz; i++)
{
printf("%d", arr[i]);
}
return 0;
}
可以看出这样的排序方法只适用于整形类型的数
那么是否有一种排序可以满足所有类型都适用的排序呢?
qsort函数排序
应用:
在这里需要补充一下void* 类型的指针
void in_mp(const void* p1, const void* p2)
{
return(*(int*) p1 - *(int*)p2);
}
void print(int arr[], int sz)
{
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d", arr[i]);
}
}
void test1()
{
int arr[] = { 9,6,7,8,5,3,4,2,1,0 };
int sz = sizeof(arr) / sizeof(arr[0]);
qsort(arr, sz, sizeof(arr[0]), in_mp);
print(arr ,sz);
}
int main()
{
test1();
return 0;
}
当然qsort函数排序既然可以实现任意类型,那么我们换几个类型试一下;
结构体类型
struct stu
{
char name[20];
int age;
};
void com_in(const void* p1, const void* p2)
{
return ((struct stu*)p1)->age - ((struct stu*)p2)->age;
}
void print(struct stu arr[], int sz)
{
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%s %d ",arr[i].name, arr[i].age);
}
}
void test2()
{
struct stu arr[] = { {"zhangsan",20},{"lisi",39},{"lihua",28} };
int sz = sizeof(arr) / sizeof(arr[0]);
qsort(arr, sz, sizeof(arr[0]), com_in);
print(arr, sz);
}
int main()
{
test2();
return 0;
}
用冒泡排序的思想实现一个功能类似于qsort函数的排序
首先我们先讲一下qsort函数的原理
然后我们用冒泡排序的思想来改造
所以我们要自己创造一个qsort排序函数就要自己写一个可以排序任意类型数据的函数
我们用冒泡排序的思想来改造,就要解决一下问题
//测试整形类型的的排序
void print(int arr[], int sz)
{
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d", arr[i]);
}
}
int in_mp(const void* p1, const void* p2)
{
return(*(int*)p1 - *(int*)p2);
}
tmp(char* put1, char* put2, int size)
{
int i = 0;
int temp = 0;
for (i = 0; i < size; i++)
{
temp = *put1;
*put1 = *put2;
*put2 = temp;
put1++;
put2++;
}
}
void bobble_sort(void* pa,int sz,int size,int(*p)(const void*,const void*))
{
int i = 0;
for (i = 0; i < sz - 1; i++) {
int j = 0;
for (j = 0; j < sz - 1 - i; j++)
{
//把每一趟的两个对数传给In_mp函数如果大于0,升序的话就要交换
if (p((char*)pa + j * size, (char*)pa + (j + 1) * size) > 0)
{
//交换
tmp((char*)pa + j * size, (char*)pa + (j + 1) * size, size);
}
}
}
}
void test1()
{
int arr[] = { 9,7,8,6,5,4,3,2,1,0 };
int sz = sizeof(arr) / sizeof(arr[0]);
bobble_sort(arr,sz,sizeof(arr[0]),in_mp);
print(arr, sz);
}
int main()
{
test1();
return 0;
}
也可以测试结构体类型
tmp(char* put1, char* put2, int size)
{
int i = 0;
int temp = 0;
for (i = 0; i < size; i++)
{
temp = *put1;
*put1 = *put2;
*put2 = temp;
put1++;
put2++;
}
}
void bobble_sort(void* pa,int sz,int size,int(*p)(const void*,const void*))
{
int i = 0;
for (i = 0; i < sz - 1; i++) {
int j = 0;
for (j = 0; j < sz - 1 - i; j++)
{
//把每一趟的两个对数传给In_mp函数如果大于0,升序的话就要交换
if (p((char*)pa + j * size, (char*)pa + (j + 1) * size) > 0)
{
//交换
tmp((char*)pa + j * size, (char*)pa + (j + 1) * size, size);
}
}
}
}
//void test1()
//{
// int arr[] = { 9,7,8,6,5,4,3,2,1,0 };
// int sz = sizeof(arr) / sizeof(arr[0]);
// bobble_sort(arr,sz,sizeof(arr[0]),in_mp);
// print(arr, sz);
//}
struct stu
{
char name[20];
int age;
};
int com_in(const void* p1, const void* p2)
{
return ((struct stu*)p1)->age - ((struct stu*)p2)->age;
}
void print(struct stu arr[], int sz)
{
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%s %d ", arr[i].name, arr[i].age);
}
}
void test2()
{
struct stu arr[] = { {"zhangsan",20},{"lisi",39},{"lihua",28} };
int sz = sizeof(arr) / sizeof(arr[0]);
bobble_sort(arr, sz, sizeof(arr[0]), com_in);
print(arr, sz);
}
int main()
{
test2();
return 0;
}