qsort函数讲解

思维导图:

目录

1.冒泡排序(bubble sort) 

2.qsort函数使用介绍:

看看文档:

3.演示使用qsort函数

3.1代码:

3.2compare函数内几个要注意的点

4.qsort函数排序结构体变量演示

4.1:比较年龄(整形) 

​编辑 4.2比较字符:

5.模拟冒泡排序实现一个qsort函数 

5.1排序整形数据

 5.2排序字符型数据

结语:


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;
}

运行:

结语:

 小牛儿今天的分享就到这里了,如果有错误的话请多多指正。如果对你有帮助或者你想要一起学习的话可以关注小牛儿,我会持续分享我学习到的知识给大家!!!

  • 14
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值