思维导图:
目录
1.冒泡排序(bubble sort)
在讲解qsort函数时我们可以先回忆一下我们曾经学习过的一个排序算法——bubble sort。比如我们要将一个整形无序数组排成升序,我们用冒泡排序算法来实现一下这个功能,代码如下:
BubbleSort(int* arr, int len) {
int i = 0;
int j = 0;
for (i = 0;i < len - 1;i++) {
for (j = 0;j < len - 1 - i;j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];//冒泡排序的核心思想—— ——两两比较
arr[j] = arr[j + 1];
arr[j+ 1] = temp;
}
}
}
}
int main() {
int arr[10] = { 5,7,9,1,3,4,6,8,2,0 };
int len = sizeof(arr) / sizeof(arr[0]);//因为在函数的内部是不能计算一个数组的长度的
//所以要在main函数内部计算好数组长度,然后再传进去
BubbleSort(arr, len);
int i = 0;
for(i = 0;i < len;i++) {
printf("%d ", arr[i]);
}
return 0;
}
看看效果:
可以看到这个冒泡排序算法是可以实现我们想要的功能的。
2.qsort函数使用介绍:
但是,我们现在已经知道了有qsort函数这个库函数了。聪明人都是喜欢聪明的偷懒的。所以今天我们就来学习一下qsort函。
看看文档:
从这一段文档中我们可以知道:
1.qsort函数的头文件是stdlib.h
2.qsort函数在排序数组时需要知道这个数组的首元素地址。
3.qsort函数函数在排序数组时需要知道数组中元素的个数,单独元素的大小。
4.我们需要自定义一个比较函数compar
5.qsort函数的不返回值。
3.演示使用qsort函数
3.1代码:
现在我们来演示一下用qsort函数来实现一个升序的排序:
#include<stdio.h>
#include<stdlib.h>//qsort函数的头文件
int compare(const void* p1, const void* p2) {//比较函数的实现
return (*(int*)p1) - (*(int*)p2);
}
int main() {
int arr[10] = { 5,7,9,1,3,4,6,8,2,0 };
int num = sizeof(arr) / sizeof(arr[0]);//计算数组中的元素个数
qsort(arr, num, sizeof(arr[0]), compare);
int i = 0;
for (i = 0;i < num;i++) {
printf("%d ", arr[i]);
}
return 0;
}
3.2compare函数内几个要注意的点
4.qsort函数排序结构体变量演示
4.1:比较年龄(整形)
#include<stdio.h>
#include<stdlib.h>
struct Stu {//定义一个结构体变量,只有名字name和年龄age
char name[20];
int age;
};
int compare_by_age(const void* p1, const void* p2) {//比较年龄
return( ((struct Stu*)p1)->age - ((struct Stu*)p2) ->age);
}
int main() {
struct Stu s[3] = { {"zhangsan",30},{"lisi",28},{"wangwu",59}};
int num = sizeof(s) / sizeof(s[0]);
qsort(s, num, sizeof(s[0]), compare_by_age);
for (int i = 0;i < num;i++) {
printf("%s %d岁\n", (&s[i])->name, (&s[i])->age);
}
return 0;
}
4.2比较字符:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct Stu {
char name[20];
int age;
};
int compare_by_name(const void* p1, const void* p2) {
return strcmp(((struct Stu*)p1)->name , ((struct Stu*)p2)->name);
//比较字符利用的是strcmp函数
}
int main() {
struct Stu s[3] = { {"zhangsan",30},{"lisi",28},{"wangwu",59} };
int num = sizeof(s) / sizeof(s[0]);
qsort(s, num, sizeof(s[0]), compare_by_name);
for (int i = 0;i < num;i++) {
printf("%s %d岁\n", (&s[i])->name, (&s[i])->age);
}
return 0;
}
5.模拟冒泡排序实现一个qsort函数
5.1排序整形数据
#include<stdio.h>
void swap( char* p1, char* p2,int width) {//width代表一个要排序类型所占的字节数
int i = 0;
for (i = 0;i < width;i++) {//一个一个字节来进行交换
char temp = *p1;
*p1 = *p2;
*p2 = temp;
p1++;
p2++;
}
}
int compare(const void* p1, const void* p2) {
return *((int*)p1) - *((int*)p2);
}
int bubble_sort(void* base, int num, int width,
int (*compare)(const void* p1,const void* p2))) {
int i = 0;
for (i = 0;i < num-1;i++) {
int j = 0;
for (j = 0;j < num - 1 - i;j++) {
if (compare ((char*)base + j * width, //将数据转化为char*型的数据,访问数据是一
//个字节一个字节的访问,这样有利于排序各
//种类型的数
(char*)base + (j + 1) * width)> 0) {
swap((char*)base + j * width, (char*)base + (j + 1) * width,width);
}
}
}
}
int main() {
int arr[10] = { 5,7,9,1,3,4,6,8,2,0 };
int num = sizeof(arr) / sizeof(arr[0]);//计算数组中的元素个数
bubble_sort(arr, num, sizeof(arr[0]), compare);
int i = 0;
for (i = 0;i < num;i++) {//打印排序后的数组
printf("%d ", arr[i]);
}
return 0;
}
5.2排序字符型数据
#include<stdio.h>
#include<string.h>
void swap(char* p1, char* p2, int width) {
int i = 0;
for (i = 0;i < width;i++) {
char temp = *p1;
*p1 = *p2;
*p2 = temp;
p1++;
p2++;
}
}
int compare(const void* p1, const void* p2) {
return strcmp(((char*)p1), ((char*)p2));
//使用了strcmp函数
//*p1==*p2相等返回0
//*p1>*p2返回正数
//*p1<*p2返回负数
}
int bubble_sort(void* base, int num, int width, int (*compare)(const void* p1, const void* p2))) {
int i = 0;
for (i = 0;i < num - 1;i++) {
int j = 0;
for (j = 0;j < num - 1 - i;j++) {
if (compare((char*)base + j * width, (char*)base + (j + 1) * width) > 0) {
swap((char*)base + j * width, (char*)base + (j + 1) * width, width);
}
}
}
}
int main() {
int s[10] = { 'b','l','p','a','d','v','o','l','e','f' };
int num = sizeof(s) / sizeof(s[0]);//计算数组中的元素个数
bubble_sort(s, num, sizeof(s[0]), compare);
int i = 0;
for (i = 0;i < num;i++) {
printf("%c ", s[i]);
}
return 0;
}
运行:
结语:
小牛儿今天的分享就到这里了,如果有错误的话请多多指正。如果对你有帮助或者你想要一起学习的话可以关注小牛儿,我会持续分享我学习到的知识给大家!!!