qsort
用来排序的函数——快速排序——需要包含头文件stdlib.h
之前有学过冒泡排序,但是冒泡排序只能排序整型数据
qsort可以排任意数据类型
qsort的四个数据
·
基于冒泡排序的算法思想,写快速排序
回顾一个概念:void*类型的指针,是不能直接解引用的,也不能进行±整数的运算
利用qsort,升序排序
#include<stdio.h>
int cmp_int(const void* p1, const void* p2)
{
return *(int*)p1 - *(int*)p2;
}
print_arr(int arr[], int sz)
{
for (int i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
}
void test1()
{
int arr[] = { 9 ,8, 6, 7, 5, 3, 4, 2, 0, 1 };
int sz = sizeof(arr) / sizeof(arr[0]);
qsort(arr, sz, sizeof(arr[0]), cmp_int);
print_arr(arr, sz);
}
int main()
{
test1();
return 0;
}
使用qsortp排序结构体数据
回顾一个概念
.(点操作符)和->(箭头操作符)都是结构体成员访问操作符
结构体变量.成员名
结构体指针->成员名(间接访问)
struct stu
{
char name[20];
int age;
};
int main()
{
struct stu s ={"zahngsan",20};
printf("%s %d", s.name, s.age);
return 0;
}
struct stu
{
char name[20];
int age;
};
void print(struct stu* ps)
{
printf("%s %d", ps->name, ps->age);
}
int main()
{
struct stu s ={"zahngsan",20};
print(&s);
return 0;
}
qsort
struct stu
{
char name[20];
int age;
};
cmp_stu_by_name(const void* p1, const void* p2)
{
return strcmp(((struct stu*)p1)->name, ((struct stu*)p2)->name);
}
void test2()
{
struct stu arr[3] = { {"zahngsan",20},{"lisi",35},{"wnagwu",18}};
int sz = sizeof(arr) / sizeof(arr[0]);
qsort(arr, sz, sizeof(arr[0]), cmp_stu_by_name);
}
int main()
{
test2();
return 0;
}
sizeof和strlen的对比
sizeof是单目操作符,不是函数!!!
最好用%zd来打印