C语言-函数指针-快速排序算法(书籍示例-入门)

概述

        使用C语言,实现结构体多元素,排序算法(冒泡排序),这里使用示例:书籍示例讲解

函数简介

函数声明

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

参数

  • base-- 指向要排序的数组的第一个元素的指针。

  • nitems-- 由 base 指向的数组中元素的个数。

  • size-- 数组中每个元素的大小,以字节为单位。

  • compar-- 用来比较两个元素的函数,即函数指针(回调函数)

编码环境:Visual Studio 2022 

1、code

#include "stdio.h"
#include <iostream>
using namespace std;


typedef struct BooksInfo_t {
	char name[20];	//书名
	char date[15];	//出版日期
	int number;		//编号
	double price;	//价格
}BooksInfo;

#define ARRAYSIZE(x) sizeof(x) / sizeof(x[0])

int Cmp_name(const void* o1, const void* o2) {//指针类型为qsort第一个参数的类型
	return strcmp(((BooksInfo*)o1)->name, ((BooksInfo*)o2)->name);
}

int Cmp_date(const void* o1, const void* o2) {
	return strcmp(((BooksInfo*)o1)->date, ((BooksInfo*)o2)->date);
}

int Cmp_number(const void* o1, const void* o2) {
	return ((BooksInfo*)o1)->number - ((BooksInfo*)o2)->number;
}

int Cmp_price(const void* o1, const void* o2) {
	double tmp = ((BooksInfo*)o1)->price - ((BooksInfo*)o2)->price;
	if (tmp > 0)
		return 1;
	else if (tmp == 0)
		return 0;
	else if (tmp < 0)
		return -1;
}

void Show(BooksInfo* info, int len)
{
	for (int i = 0; i < len; i++)
	{
		printf("%s, %s, %d, %lf\n", info[i].name, info[i].date, info[i].number, info[i].price);
	}
}


int main(void) 
{
	//初始化书籍结构体
	BooksInfo book[] = {
		"C     ", "2022.1.23", 20, 85.5,
		"C++   ", "2023.4.28", 19, 96.5,
		"Java  ", "2000.8.09", 5, 102.5,
		"Python", "2019.3.02", 92, 65.8,
		"C#    ", "2024.12.5", 7, 155.9
	};

	//按书名排序
	qsort(book, ARRAYSIZE(book), sizeof(book[0]), Cmp_name);
	printf("按书名排序:\n");
	Show(book, ARRAYSIZE(book));

	//按出版日期排序
	qsort(book, ARRAYSIZE(book), sizeof(book[0]), Cmp_date);
	printf("按出版日期排序:\n");
	Show(book, ARRAYSIZE(book));

	//按编号排序
	printf("按编号排序:\n");
	qsort(book, ARRAYSIZE(book), sizeof(book[0]), Cmp_number);
	Show(book, ARRAYSIZE(book));

	//按价格排序
	qsort(book, ARRAYSIZE(book), sizeof(book[0]), Cmp_price);
	printf("按价格排序:\n");
	Show(book, ARRAYSIZE(book));

	return 0;
}

2、运行结果

3、总结

        希望能帮助到需要的人,加油,噢力给 ^_^!!! 

  • 11
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Ch_champion

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

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

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

打赏作者

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

抵扣说明:

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

余额充值