你还在用冒泡法排序吗?qsort()函数:实现快速排序

qsort ()是可以实现不管是数字还是字符串快速排序的函数。

头文件:

#include <stdlib.h>

语法:

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

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

	qsort(num, 4, sizeof(num[0]),compare );

compar参数
compar参数指向一个比较两个元素的函数。比较函数的原型应该像下面这样。 注意两个形参必须是const void * 型 ,同时在调用compar 函数(compar实质为函数指针,这里称它所指向的函数也为compar)时,传入的实参也必须转换成const void *型。在compar函数内部会将const void *型转换成实际类型。
int compar(const void * p1, const void * p2);

如果compar返回值小于0(< 0),那么p1所指向元素会被排在p2所指向元素的左面;
如果compar返回值等于0(= 0),那么p1所指向元素与p2所指向元素的顺序不确定;
如果compar返回值大于0(> 0),那么p1所指向元素会被排在p2所指向元素的右面。

功能:

1.数字重排序

例如:

#include <stdio.h>
#include <stdlib.h>
int compare(const void* a, const void* b) {
    
    
	return *(int*)b - *(int*)a;
}//从大到小排列
int main()
{
    
    
	int num[4] = {
    
    3,9,1,4};
	qsort(num, 4, sizeof(num[0]),compare );
	for (int i = 0;i < 4;i++) {
    
    
		printf("%d", num[i]);
	}
}

结果

int compare(const void* a, const void* b) {
    
    
	return *(int*)a - *(int*)b;
}//从小到大排列

结果

2.字符串重排序

#include  <stdio.h>
#include <stdlib.h>
#include <string.h>
int compare(const void* p1, const void* p2) {
    
    
	return strcmp((char*)p2, (char*)p1);
}
int main()
{
    
    
	char str[] = "hello";
	qsort(str, 5, sizeof(str[0]),compare );
		printf("%s", str);
}

结果

这里再另外介绍一下strcmp()函数
头文件:

#include <string.h>

语法:

int strcmp(const char* stri1,const char* str2);

返回值:
如果返回值 < 0,则表示 str1 小于 str2。
如果返回值 > 0,则表示 str2 小于 str1。
如果返回值 = 0,则表示 str1 等于 str2。

功能:比较两个字符串的大小

例如:

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

int main()
{
    
    
	char str1[2] = "a";
	char str2[2] = "b";
	if (strcmp(str1, str2)>0) {
    
    
		printf("%s大于%s", str1, str2);
	}
	if (strcmp(str1, str2) < 0) {
    
    
		printf("%s大于%s", str2, str1);
	}
	else {
    
    
		printf("%s等于%s", str2, str1);
	}
}

结果
使用该函数与冒泡法进行比较,代码量不一定有减少,但是运行速度会比冒泡快一些。
例如,以下用冒泡法进行数字排序:

#include  <stdio.h>
int main()
{
    
    
	int num[4] = {
    
     3,9,1,4 };
	int n;
	for (int i = 0;i < 4;i++) {
    
    
		for (int j = 0;j < 4;j++) {
    
    
			if (num[j] < num[j + 1]) {
    
    
				n = num[j];
				num[j] = num[j + 1];
				num[j + 1] = n;
			}
		}
	}
	for (int i = 0;i < 4;i++) {
    
    
		printf("%d", num[i]);
	}
}

用冒泡法进行字符串排序:

#include  <stdio.h>
int main()
{
    
    
	char str[] = "hello";
	char n;
	for (int i = 0;i < 4;i++) {
    
    
		for (int j = 0;j < 4;j++) {
    
    
			if (str[j] < str[j + 1]) {
    
    
				n = str[j];
				str[j] = str[j + 1];
				str[j + 1] = n;
			}
		}
	}
	printf("%s", str);
}

猜你喜欢

转载自blog.csdn.net/weixin_52340203/article/details/114549748
今日推荐