qsort快排用法

通过洛谷的一道题,知道了qsort函数,

上题

这个题如果用快排,那就非常简单,那么问题来了,快排是什么?

进入正题:

首先他的函数:

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

一、初识qsort

1.base 是首元素的地址,数组名;可以看到他写的时void*,意思时表达这里可以传递任意类型的数组;

2.num是 需要排序的元素个数,数组的大小;

3.size是元素的大小;(qsort是可以排序任意数据类型的数据,用void来接收。但之后需要对他进行强制类型转换)

4.compar是要比较的两个元素,这里只需要填函数名即可;

5.该函数时包含在<stdlib.h>,所以在使用时要写出他的头文件。

二、核心——函数

函数的核心在于写出后边需要比较的部分。

举个比较整形数组的例子:

上代码(别急后边会分开说明)

#include <stdlib.h>
#include <stdio.h>
int cmp_int(const void* _a, const void* _b)
{
    int* a = (int*)_a;  
    int* b = (int*)_b;
    return *a - *b;
}
int main() {
	int arr[] = {1,0,8,6};
	printf("排序前:"); 
	for(int i = 0; i < sizeof(arr)/sizeof(arr[0]); ++i)
	{
		printf("%d  ",arr[i]);
	}
	
	qsort(arr,sizeof(arr)/sizeof(arr[0]) ,sizeof(arr[0]), cmp_int); 
	
	printf("\n排序后:");
	for(int i = 0; i < sizeof(arr)/sizeof(arr[0]); ++i)
	{
		printf("%d  ",arr[i]);
	}
} 

 先看函数的引用,即

qsort(arr,sizeof(arr)/sizeof(arr[0]) ,sizeof(arr[0]), cmp_int); 

这一部分,有四部分,①数组名即首地址②数组的大小③元素的大小④函数;

再看④中的函数

int cmp_int(const void* _a, const void* _b)
{
    int* a = (int*)_a;  
    int* b = (int*)_b;
    return *a - *b;
}

函数首部的a也是void*表示它可以接收任何类型的元素。因为是对整形数组排序,所以对其强制转换后,相减返回一个>0或<0或=0;即可判断大小。

那么他的运行结果为

 那么如果对浮点型数据排序呢?

很简答只需要在转换类型时,将其转换为float或者double。那么在相减的时候,

  return *a - *b;

 这个地方将会冲突,那么我们就需要直接对其判断大小

int inc (const void * a, const void * b)
{
return *(double *)a > *(double *)b ? 1 : -1;
}

当前>后值为1,否则为-1;

当然也可以对字符型,字符和整形就没有太大区别了。

再回到最开头,去解决“奖学金”,这个题目时对结构体进行排序。

代码又又又又来了

#include<stdio.h>
#include<stdlib.h>
struct stu
{
	int num;
	int a,b,c;
	int sum;
};
int cmp(const void *a,const void *b)
{
	int t1=(*(struct stu*)b).sum-(*(struct stu *)a).sum;
	if(t1==0)
	{
	int t2=(*(struct stu*)b).a-(*(struct stu *)a).a;
		if(t2==0)
		{
		return (*(struct stu *)a).num - (*(struct stu *)a).num;
		}
	else return t2;}
	else return t1;
}
int main()
{
	int n;
	scanf("%d",&n);
	struct stu a[n];
	for(int i=0;i<n;i++)
	{
		scanf("%d %d %d",&a[i].a,&a[i].b,&a[i].c);
		a[i].sum=a[i].a+a[i].b+a[i].c;
		a[i].num=i+1;
	}
	qsort(a,n,sizeof(a[0]),cmp); 
	for(int i=0;i<5;i++)
	{
		printf("%d %d",a[i].num,a[i].sum);
		printf("\n");
	}
	return 0;
}

与整形数组相比最大差别就在最后的函数那里。,先比较总成绩,再依次语文,数学。

到此qsort先结束了;

初始qsort,所以所以......

我以后还没来补充的,当然还有其它几种经典排序。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值