目录
qsort功能简介:对任意类型的数组进行排序,如整型数组,结构体数组等。
[1.参考qsort函数的参数(我会专门写一个关于qsort函数的理解)。分别为数组首元素的地址,数组元素的个数,数组内每个元素的大小以及一个指针指向的是两个元素的比较函数 。](#1.参考qsort函数的参数(我会专门写一个关于qsort函数的理解)。分别为数组首元素的地址,数组元素的个数,数组内每个元素的大小以及一个指针指向的是两个元素的比较函数 。)
总体思路:与上文大致相同,但是要注意,结构体成员的间接访问符(->),以及strcmp函数(它是专门用来比较字符串的)。
qsort功能简介:对任意类型的数组进行排序,如整型数组,结构体数组等。
1.模拟实现整型数组的排序
代码如下:
cs
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
//1.交换函数
void Exchange(char* p1, char* p2,int width)
{
for (int i = 0; i < width; i++)
{
int tmp = *p1;
*p1 = *p2;
*p2 = tmp;
p1++;
p2++;
}
}
//2.模拟实现排序的冒泡排序框架
void boubble_qsort(int* base, int len , int width , int(*cmp_all)(const void* p1 , const void* p2))
{
for (int i = 0; i < len - 1; i++)
{
for (int j = 0; j < len - 1 - i; j++)
{
if ( ((char*)base+j*width - (char*)base + (j+1) * width) > 0)//如果二者相减大于0,则二者进行交换
{
//进行交换
Exchange(((char*)base + j * width), ((char*)base + (j + 1) * width),width);
}
}
}
}
//3.打印函数
void Print(int* p, int len)
{
for (int i = 0; i < len; i++)
{
printf("%d ", *(p + i));
}
printf("\n");
}
//4.两个数的比较函数
int cmp_int(const void* p1, const void* p2)
{
return (*(int*)p1 - *(int*)p2);
}
//5,主函数
int main()
{
int arr[10] = {9,8,7,6,5,4,3,2,1,0};
int len = sizeof(arr) / sizeof(arr[0]);
boubble_qsort(arr, len, sizeof(arr[0]), cmp_int);
Print(arr, len);
return 0;
}
总体实现思路:
1.参考qsort函数的参数(我会专门写一个关于qsort函数的理解)。分别为数组首元素的地址,数组元素的个数,数组内每个元素的大小以及一个指针指向的是两个元素的比较函数 。
2.根据冒泡排序思路,两个for循环是肯定没问题的,要变的一定是判断何时交换的if判断条件,但是此时,我们只知道首元素地址,但不知道指针类型,所以根本不可以直接解引用,此时我们根据下图进行分析,int类型的数组之间每个元素为4个字节,此时如果使用((char*)base+4)是不是就可以得到第二个元素的地址了,(因为char*类型的指针+1会往后移动一个字节)。而第j个和第(j+1)个是不是也就可以推到了。
2.模拟实现结构体数组的排序
代码如下:
cs
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
//1.交换函数
void Exchange(char* p1, char* p2,int width)
{
for (int i = 0; i < width; i++)
{
int tmp = *p1;
*p1 = *p2;
*p2 = tmp;
p1++;
p2++;
}
}
//2.模拟实现的冒泡函数框架
void boubble_qsort(int* base, int len , int width , int(*cmp_all)(const void* p1 , const void* p2))
{
for (int i = 0; i < len - 1; i++)
{
for (int j = 0; j < len - 1 - i; j++)
{
if ( ((char*)base+j*width - (char*)base + (j+1) * width) > 0)//如果二者相减大于0,则二者进行交换
{
//进行交换
Exchange(((char*)base + j * width), ((char*)base + (j + 1) * width),width);
}
}
}
}
//3.打印函数
void Print(int* p, int len)
{
for (int i = 0; i < len; i++)
{
printf("%d ", *(p + i));
}
printf("\n");
}
//4.结构体
struct Stu
{
char name[20];
int age;
};
//5.比较函数
int cmp_struct_by_name(const void* p1 ,const void* p2)
{
return strcmp((((struct Stu*)p1)->name), (((struct Stu*)p2)->name));
}
//6.主函数
int main()
{
struct Stu s1[3] = { {"zhangsan",20},{"lisi",35},{"wangwu",18} };
int len1 = sizeof(s1) / sizeof(s1[0]);
boubble_qsort(s1, len1, sizeof(s1[0]), cmp_struct_by_name);
Print(arr, len);
return 0;
}