C语言中qsort函数基本用法及分析(赋有练习题)

qsort函数是C语言标准库中的一个函数,主要是用来对指定类型数组进行排序,使用的是快速排序算法,可以对任意类型的数据进行排序。

注意,qsort函数是stdlib库的一个函数,所以在使用前要先声明stdlib库

#include<stdio.h>
#include<stdlib.h>

qsort函数包含四个参数,如下所示

void qsort(void* base, size_t num, size_t size, int (*compar)(const void*,const void*)); 

第一个参数 base指向要排序的第一个元素,类型为void*
第二个参数 num代表待排序数组的元素个数
第三个参数 size代表待排序数组元素的大小(单位是字节)(对数据类型字节大小不太清楚的同学们,可以看我之前发的博客)跳转博客链接
第四个参数是一个整形函数指针*compar(),指向比较函数,比较函数会返回三种结果,如下所示

int compar(const void* e1,const void* e2){
    if(*(int*)e1-*(int*)e2>0) return 1;
    if(*(int*)e1-*(int*)e2==0) return 0;
    if(*(int*)e1-*(int*)e2<0) return -1;
}
//因为e1和e2是const void* 类型,所以先要把e1和e2强制类型转换为int*类型,在进行解引用,才能进行比较,返回对应的结果

此外如果想让待排序数组递增排序,只需要把if条件判断语句中的e1和e2调换位置即可。

用法用例
#include <stdio.h>      /* printf */
#include <stdlib.h>     /* qsort */
int compare (const void * a, const void * b){
  return ( *(int*)a - *(int*)b );//如果a>b返回大于0的值,a=b返回0,a<b返回小于0的值,和上面的返回用法是一样的
}
int main (){
  int arr[] = { 40, 10, 100, 90, 20, 25 };
  int sz=sizeof(arr)/sizeof(int);
  int i;
  printf("排序前数组是:");
  for(i=0;i<sz;i++){
  printf("%d ",arr[i]);
  }
  printf("\n");
  qsort (arr, sz, sizeof(int), compare);
  printf("排序后数组是:");
  for (i=0; i<sz; i++)
     printf ("%d ",arr[i]);
  return 0;
}

用法用例运行结果如下图所示
在这里插入图片描述

待排序数组是字符型数组

#include<stdio.h>
#include<stdlib.h>
int compare(const void* a, const void* b) {
	return *(char*)a - *(char*)b;
}
int main() {
	char arr[] = { 'e', 'd', 'a', 'f', 'b', 'c' };
	int sz = sizeof(arr) / sizeof(char);
	int i;
	printf("排序前数组是:");
	for (i = 0; i < sz; i++) {
		printf("%c ", arr[i]);
	}
	printf("\n");
	qsort(arr, sz, sizeof(char), compare);
	printf("排序后数组是:");
	for (i = 0; i < sz; i++)
		printf("%c ", arr[i]);
	return 0;
}

运行结果如下图所示
在这里插入图片描述

待排序数组是浮点型数组(float),如果是double只需要把float改成double即可

#include<stdio.h>
#include<stdlib.h>
int compare(const void *a,const void *b) {
if(*(float*)a>*(float*)b) return 1;
if(*(float*)a==*(float*)b) return 0;
if(*(float*)a<*(float*)b) return -1;
}
int main (){
  float arr[] = { 40, 10, 100, 90, 20, 25 };
  int sz=sizeof(arr)/sizeof(float);
  int i;
  printf("排序前数组是:");
  for(i=0;i<sz;i++){
  printf("%f ",arr[i]);
  }
  printf("\n");
  qsort (arr, sz, sizeof(float), compare);
  printf("排序后数组是:");
  for (i=0; i<sz; i++)
     printf ("%f ",arr[i]);
  return 0;
}

运行结果如下图所示
在这里插入图片描述

待排序数组是结构体类型数组

#include<stdio.h>
#include<stdlib.h>
struct Stu {
	char name[20];
	int age;
};
int compare(const void* a, const void* b) {
	return ((struct Stu*)a)->age - ((struct Stu*)b)->age;
}
int main() {
	struct Stu arr[] = { {"张三",30},{"李四",20},{"王五",40}};
	int sz = sizeof(arr) / sizeof(struct Stu);
	int i;
	printf("排序前数组是:");
	for (i = 0; i < sz; i++) {
		printf("%s %d ", arr[i].name,arr[i].age);
	}
	printf("\n");
	qsort(arr, sz, sizeof(struct Stu), compare);
	printf("排序后数组是:");
	for (i = 0; i < sz; i++)
		printf("%s %d ", arr[i].name, arr[i].age);
	return 0;
}

运行结果如下图所示
在这里插入图片描述

qsort函数的时间复杂度是O(nlogn)

如果学会的话,做一个练习题吧,练习题链接放在下面了
力扣练习题
qsort函数的讲解就到此结束了,如果有什么不对的地方请指正!!感谢各位同学的访问。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

愚蠢的一枚大学生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值