冒泡排序终极版(模拟qsort)

news2024/11/19 12:33:36

目录

普通版冒泡排序

qosrt函数

终极版冒泡排序

终极版冒泡排序整体测试代码


普通版冒泡排序

冒泡排序想必大家都很了解了吧,冒泡排序的算法思想就是两两比大小,一轮一轮比,每比完一轮排出一个数字的顺序,那就让我们先来看一个普通的冒泡排序代码>


void bubble_sort(int arr[], int sz)//参数接收数组元素个数
{
	int i = 0;
	for (i = 0; i < sz - 1; i++)
	{
		int j = 0;
		for (j = 0; j < sz - i - 1; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
		}
	}
}
int main()
{
	int arr[] = { 3,1,7,5,8,9,0,2,4,6 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	int i = 0;
	bubble_sort(arr, sz);
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

先看代码效果>

可以看到数组中的内容变成了由小到大的顺序,那如何让数组成为由大到小的顺序呢?很简单我们只需要把if (arr[j] > arr[j + 1])中的改成,我们来看看效果>

void bubble_sort(int arr[], int sz)//参数接收数组元素个数
{
	int i = 0;
	for (i = 0; i < sz - 1; i++)
	{
		int j = 0;
		for (j = 0; j < sz - i - 1; j++)
		{
			if (arr[j] < arr[j + 1])
			{
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
		}
	}
}
int main()
{
	int arr[] = { 3,1,7,5,8,9,0,2,4,6 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	int i = 0;
	bubble_sort(arr, sz);
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

 这样就达到了我们最终的效果了。

但是我们发现,普通的冒泡排序只能对整型的数据进行排序而其它类型的则无法排序,这就不得不动动我们的发财的小脑袋,其实C语言库函数中有一个qsort函数,这里我们先学习一下qsort函数的使用方法:我们可以打开我们的MSDN这款软件。

qosrt函数

打开MSDN搜索qsort我们可以看到函数的定义:

 

有道翻译> 

 我们可以看到qsort函数参数分别是数组地址、数组元素个数、数组元素大小(字节)、一个比较函数,返回值为void.,其内部实现了一个快速排序算法,对一个num元素进行排序,每个元素都是width字节,参数base是一个指针,指向要排序数组的首元素地址,qsort用已经排序的元素覆盖这个数组,compare是一个函数指针,再使用的同时我们要自己书写比较函数int_cmp

我们来代码演示一下>
 

int int_cmp(const void* p1, const void* p2)
{
	return (*(int*)p1 - *(int*)p2);
}
int main()
{
	int arr[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };
	int i = 0;
	qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(int), int_cmp);
	for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
	return 0;
}

 看效果>

 如果需要由大到小排序的话只需将int_cmp函数中的p1p2互换就可以啦。

终极版冒泡排序

学完了qsort函数,我们可以模仿qosrt函数来改装我们的冒泡排序>

我们可以将我们的冒泡排序函数也改为四个参数:

void bubble_sort(void* base, size_t sz, size_t width, int(*cmp)(const void*, const void*))

比较函数部分>

int cmp_int(const void* e1, const void* e2)
{
	return *(int*)e1 - *(int*)e2;
}
int cmp_by_name(const void* e1, const void* e2)
{
	return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
}
int cmp_by_age(const void* e1, const void* e2)
{
	return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
}

 分别为int、结构体字符型、结构体整型。

冒泡排序函数>

void bubble_sort(void* base, size_t sz, size_t width, int(*cmp)(const void*, const void*))
{
	size_t i = 0;
	for (i = 0; i < sz - 1; i++)
	{
		size_t j = 0;
		for (j = 0; j < sz - 1 - i; j++)
		{
			if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) > 0)
			{
				Swap((char*)base + j * width, (char*)base + (j + 1) * width, width);
			}
		}
	}
}

 Swap函数>

void Swap(char* buf1, char* buf2, int width)
{
	int i = 0;
	for (i = 0; i < width; i++)
	{
		char tmp = *buf1;
		*buf1 = *buf2;
		*buf2 = tmp;
		buf1++;
		buf2++;
	}
}

Swap函数的功能是将元素以一个字节的大小进行交换交换width次。

这样我们就可以写出可以排序任意类型元素的冒泡排序了

终极版冒泡排序整体测试代码

struct Stu
{
	char name[20];
	int age;
};


int cmp_int(const void* e1, const void* e2)
{
	return *(int*)e1 - *(int*)e2;
}
int cmp_by_name(const void* e1, const void* e2)
{
	return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
}
int cmp_by_age(const void* e1, const void* e2)
{
	return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
}


void Swap(char* buf1, char* buf2, int width)
{
	int i = 0;
	for (i = 0; i < width; i++)
	{
		char tmp = *buf1;
		*buf1 = *buf2;
		*buf2 = tmp;
		buf1++;
		buf2++;
	}
}


void bubble_sort(void* base, size_t sz, size_t width, int(*cmp)(const void*, const void*))
{
	size_t i = 0;
	for (i = 0; i < sz - 1; i++)
	{
		size_t j = 0;
		for (j = 0; j < sz - 1 - i; j++)
		{
			if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) > 0)
			{
				Swap((char*)base + j * width, (char*)base + (j + 1) * width, width);
			}
		}
	}
}


void test1()
{
	int arr[10] = { 2,5,9,1,3,6,4,7,8,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	bubble_sort(arr, sz, sizeof(arr[0]), cmp_int);
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");


}
void test2()
{
	struct Stu a[3] = { {"zhangsan",18},{"lisi",15},{"wangwu",25} };
	int sz = sizeof(a) / sizeof(a[0]);
	bubble_sort(a, sz, sizeof(a[0]), cmp_by_name);
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%s ", a[i].name);
	}
	printf("\n");


}
void test3()
{
	struct Stu a[3] = { {"zhangsan",18},{"lisi",15},{"wangwu",25} };
	int sz = sizeof(a) / sizeof(a[0]);
	bubble_sort(a, sz, sizeof(a[0]), cmp_by_age);
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", a[i].age);
	}
	printf("\n");
}
int main()
{
	test1();
	test2();
	test3();
	return 0;
}

运行结果>

 本节课代码已上传gitee

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/157133.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软件测试/测试开发丨从 0 开始学 Python 自动化测试开发(二):环境搭建

本文是「从 0 开始学 Python 自动化测试开发」专题系列文章第二篇 —— 环境搭建篇&#xff0c;适合零基础入门的同学。没有阅读过上一篇的同学&#xff0c;请戳蓝色字体阅读。作者方程老师&#xff0c;是前某跨国通信公司高级测试经理&#xff0c;目前为某互联网名企资深测试技…

【算法基础】1.4 高精度(模拟大数运算:整数加减乘除)

文章目录高精度加法题目描述解法高精度减法题目描述解法讲解高精度乘法题目描述解法讲解高精度除法题目描述解法讲解本文主要讲解高精度计算&#xff0c;包括加法、减法、乘法和除法。 对于Python选手&#xff0c;python自带高精度计算&#xff1b;Java也有BigInteger类。但是对…

javaEE 初阶 — 多线程— JUC(java.util.concurrent) 的常见类

文章目录1. Callable 接口1.1 Callable 的用法2. ReentrantLock2.1 ReentrantLock 的缺陷2.1 ReentrantLock 的优势3. 原子类4. 信号量 Semaphore5. CountDownLatch6. 相关面试题1. Callable 接口 类似于 Runnable 一样。 Runnable 用来描述一个任务&#xff0c;描述的任务没有…

我们一直在说数字化转型,什么才是数字化转型?

我们一直在说数字化转型&#xff0c;什么才是数字化转型&#xff1f;深度长文&#xff0c;4000字&#xff0c;融合了很多国内外专业期刊观点&#xff0c;一文讲清到底什么是企业数字化转型&#xff0c;心急的小伙伴可以先看目录&#xff1a; 关于定义——到底什么是“数字化转…

24 届秋招 | 高质量学习交流环境

大家好&#xff0c;我和一些计算机方向、背景非常优秀的、来自清华、新国立等知名大学的几位同学以及工作多年的高级研发工程师一起运营了一个知识星球。 星球里有大量国内top985、海外名校的同学在一起&#xff0c;目的是为了打造一个非常优质量的社群。 如果你也曾苦于在各…

PySimpleGUI图形化界面实现Office文件格式转换

PySimpleGUI图形化界面实现Office文件格式转换Python实现三种文件两个版本的格式转换1、doc与docx格式互相转换2、xls与xlsx格式互相转换3、ppt与pptx格式互相转换PythonPySimpleGUI实现综合版本Python实现三种文件两个版本的格式转换 1、doc与docx格式互相转换 这里主要运用…

excel求和技巧:如何忽略错误值进行求和

按照对应的订单号引用已有的收货金额&#xff0c;这种问题相信很多朋友都会处理&#xff0c;用VLOOKUP函数就能搞定。我们今天要讨论的是如何对含有错误值的数据进行求和。如果直接求和&#xff0c;得到的结果也是一个错误值&#xff0c;如下图&#xff1a;对于这种要对含有错误…

Linux驱动开发基础__ Linux中断系统中的重要数据结构

目录 1 整体概述 2 irq_desc 数组 3 irqaction 结构体 4 irq_data 结构体 5 irq_domain 结构体 6 irq_chip 结构体 1 整体概述 该文章内容&#xff0c;可以从 request_irq(include/linux/interrupt.h)函数一路分析得到。 能弄清楚下面这个图&#xff0c;对 Linux 中…

Domino Nomad Web 1.0.6!

大家好&#xff0c;才是真的好。 虽然Domino Notes 9.0.x版本早前宣布从本月开始停止市场商业推广&#xff0c;并逐步停止技术支持服。但没让人意外的是&#xff0c;12月5号&#xff0c;HCL更新了一版Domino Notes 9.0.1版本的补丁程序FP10IF10&#xff1a; 没有任何额外的说…

车规级CAN FD收发器SIT1044Q,能替代TJA1044吗?

国际知名品牌NXP推出的TJA1042Q、TJA1043Q、TJA1044Q、TJA1051Q等CAN FD收发器芯片&#xff0c;相信很多电子工程师并不陌生。这类芯片应用中&#xff0c;非常成熟稳定&#xff0c;深受汽车电子工程师的认可、支持和青睐。然而&#xff0c;在实际应用中&#xff0c;很多客户由于…

新建文本文档

Spring Boot 加载外部配置文件 Spring Boot 允许你从外部加载配置&#xff0c;这样的话&#xff0c;就可以在不同的环境中使用相同的代码。支持的外部配置源包括&#xff1a;Java属性文件、YAML文件、环境变量、命令行参数。 用Value注解可以将属性值直接注入到beans中。命令行…

【win11环境编译安装deformable Detr的MultiScaleDeformableAttention模块】

Microsoft Visual C 14.0 is required.1.Compiling CUDA operators2.安装Build Tools for Visual Studio3.安装合适的cuda4.编译1.Compiling CUDA operators cd ./models/ops sh ./make.sh # unit test (should see all checking is True) python test.pyNote: win11 or win10…

经认定的闵行区企业技术中心给予10万元资助

闵行区企业技术中心一、主管部门闵行区经济委员会二、政策依据《闵行区关于推进先进制造业高质量发展的若干产业政策意见》&#xff08;闵府规发〔2020〕5号&#xff09;《闵行区企业技术中心认定管理办法》&#xff08;闵经委规发〔2021〕2号&#xff09;《关于申报认定2022年…

搭建Go环境 03

1、windows下搭建go环境 1、介绍SDK 1、SDK&#xff08;软件开发工具包&#xff09; 2、SDK是给开发人员使用的&#xff0c;其中包含了对应开发语言的工具包 2、下载SDK Go官方镜像站(国内用户推荐): https://golang.google.cn/dl/ 官网下载 https://golang.org/dl/ # 安装事项…

【参考答案】java基础练习:变量、数据类型、输入、输出、运算符

练习1&#xff1a;判断输入的值是否是偶数&#xff0c;另外&#xff0c;要处理输入错误 (目的&#xff1a;熟悉输入、输出&#xff0c;特别是Scanner对象的方法) package com.qzcsbj;import java.util.Scanner;public class Test {public static void main(String[] args) {Sca…

Hudi集成Spark(一)Spark Shell方式

文章目录环境准备安装 Spark启动 Hadoop&#xff08;略&#xff09;spark-shell 方式启动 spark-shell插入数据查询数据查询数据更新数据增量查询指定时间点查询删除数据覆盖数据环境准备 安装 Spark 1&#xff09;Hudi 支持的 Spark 版本 HudiSupported Spark 3 version0.1…

131页8万字数字化矿山整体解决方案

【版权声明】本资料来源网络&#xff0c;知识分享&#xff0c;仅供个人学习&#xff0c;请勿商用。 【侵删致歉】如有侵权请联系小编&#xff0c;将在收到信息后第一时间删除&#xff01; 完整资料领取见文末&#xff0c;部分资料内容&#xff1a; 目 录 1、煤矿综合自动化系统…

两台 mac 通过 scp 命令快速传输数据

这两天由于电脑进水了&#xff0c;所以申请换了一台 mac 电脑&#xff0c;所以想把老电脑的数据拷贝到新电脑&#xff0c;折腾了半天&#xff0c;最后还是发现 scp 命令最好用。 使用 「scp 命令方式」之前尝试的其他方法 1、隔空投送 刚开始使用那个隔空投送功能&#xff0c;但…

数据结构与算法(一)——时间复杂度和空间复杂度

时间复杂度 1、概念引入 先说结论&#xff1a;时间复杂度是用来估计算法运行时间的一个式子&#xff08;单位&#xff09;。 例如&#xff1a;这四组代码&#xff0c;哪组运行时间最短&#xff1f; q&#xff1a;我们该用什么方式来体现算法运行的快慢&#xff1f; a&#…

安卓apk包破解

安卓apk包破解前言一、前置工作二、正式开始前言 拿到安卓的apk包如何&#xff0c;如何破解呢。流程如下 一、前置工作 拿到一个apk文件&#xff0c;修改其后缀为zip 例如&#xff1a; test.apk > test.zip 使用解压工具进行解压。解压后如图 获取到原始文件目录&…