当前位置:   article > 正文

C语言—内置函数实现排序

C语言—内置函数实现排序

C语言—内置函数实现排序

简介

qsort函数C语言编译器函数库自带的排序函数,也叫快速排序函数。

相比较于冒泡排序,快速排序可以用更加快捷的速度去排列升降序,它的时间复杂度只有O(N*logN),冒泡排序的代码只能排列整型的数据,时间复杂度为O(n^2),比前者更高。(这么说吧,若是小明要从北京到上海,有两种方法,一种是坐火车(冒泡排序)去,一种是坐飞机(快速排序)去,由此可见其效率的不同。
C语言的qsort函数虽然没有C++或者Python中的直接调用来得方便,但好处就是快速排序函数qsort函数可以排列任何类型的数据,例如浮点型,字符型,结构体中可以按年龄大小排列,可以按名字首字母排列…等等,不用进行类型转换

函数结构

在这里插入图片描述
各个参数含义

base-- 指向要排序的数组的第一个元素的指针。
nitems-- 由 base 指向的数组中元素的个数。
size-- 数组中每个元素的大小,以字节为单位。
compare-- 用来比较两个元素的大小的一个函数,是函数指针(回调函数)

代码

1.1、一般整形数组排序

//qsort函数——快速排序
 
# include<stdio.h>
#include<stdlib.h>
 
int cmp_t(const void* p1, const void* p2) {
	return(*(int*)p1 - *(int*)p2);
	}
int main() {
	int arr[] = { 1,7,6,4,5,9,3,2,0,8 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]),  cmp_t);
	int i = 0;
	for (i = 0; i < sz; i++) {
		printf("%d ", arr[i]);
	}
	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

在这里插入图片描述
在函数cmp_t中,p1-p2完成的是升列排序,p2-p1完成降列排序。 你可以根据想要的顺序进行两指针位置的调换。
qsort传递的是指针,对于指针的比较,我们必须要将指针强制转化为相应的数据类型,比如排列浮点型数据,就将两指针强转为 (float
);排列字符型数据,就将两指针强转为( char
);排列结构体型数据就强转为( struct 结构体名称
)…
***

1.2、qsort对于结构体数组的排序

#include<stdlib.h>
#include<string.h>
struct Stu {
	char name[15];
	int age;
};
 
int cmp_t1(const void* p1, const void* p2) {//对姓名的排序
	return strcmp(((struct Stu*)p1)->name, ((struct Stu*)p2)->name);
}
 
void test1() {
	struct Stu s[3] = { {"zhangsan",23},{"lisi",19},{"wangwu",30} };
	int sz = sizeof(s) / sizeof(s[0]);
	//qsort(s, sz, sizeof(struct Stu), cmp_t1);——对姓名的排序
 
//打印数组
int i = 0;
	for (i = 0; i < sz; i++) {
		printf("%s ", s[i].name);
		printf("%d \n", s[i].age);
	}
}
 
int main() {
	test1();
	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

:在上面的结构体成员变量中有姓名和年龄,我们可以选择姓名的首字母来进行对结构体数组的排序。姓名是字符串数据,那么我们便要使用字符串函数strcmp函数进行比较,还完美解决了回调函数返回值的问题
strcmp函数实现方法是对两组字符串中相应位置的比较,例如"abcdef"和" abcrgitho" 这两个字符串,从两字符串的首字符一对一对的比较,串1的a与串2的a比较,比较大小相同,再向后进行比较,直到在两字符串的第四位置,串1是d,串2是r,字符r的ASCII码值大于字符c,所以字符串2大,*e1- *e2,所以字符串2会排序到靠后的位置。

#include<stdlib.h>
 
struct Stu {
	char name[15];
	int age;
};
 
int cmp_t2(const void* p1, const void* p2) {//对年龄的排序
	return ((struct Stu*)p1)->age- ((struct Stu*)p2)->age;
}
 
void test1() {
	struct Stu s[3] = { {"zhangsan",23},{"lisi",19},{"wangwu",30} };
	int sz = sizeof(s) / sizeof(s[0]);
	qsort(s, sz, sizeof(struct Stu), cmp_t2);//——对年龄的排序
	int i = 0;
	for (i = 0; i < sz; i++) {
		printf("%s ", s[i].name);
		printf("%d \n", s[i].age);
	}
}
int main() {
	test1();
	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

1.3、qsort对浮点型数组的排序

//qsort对浮点型数据的排序
 
int cmp_t(const void* p1, const void* p2) {
	return ((int)(*(float*)p1 - *(float*)p2));//float型指针相减的结果为float,需要强制转换为Int
}
int main() {
	float arr[] = { 9.0,8.0,7.0,6.0,5.0,4.0,3.0,2.0,1.0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), cmp_t);
 
 
	int i = 0;
	for (i = 0; i < sz; i++) {
		printf("%2f ", arr[i]);
	}
	return 0;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

1.4、对字符串进行排序

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

int cmp(const void* e1, const void* e2)
{
	return strcmp(*(char**)e1, *(char**)e2); //其实最关键的是这一步为什么不是 strcmp((char*)e1, (char*)e2);

}
int main()
{
	char* arr[3] = { "hcia","ccie","aacp" };

	qsort(arr,sizeof(arr)/sizeof(arr[0]),sizeof(arr[0]),cmp);
    for(i=0;i<3;i++)printf("%s\n",arr[i]);
	return 0;
}


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/251524
推荐阅读
相关标签
  

闽ICP备14008679号