十种排序算法(1) - 准备测试函数和工具

news2024/11/18 1:51:58

1.准备工作

我们先写一堆工具,后续要用,不然这些写在代码里可读性巨差

#pragma once
#include<stdio.h>

//为C语言定义bool类型
typedef int bool;
#define false 0
#define true 1

//用于交互a和b
inline void swap(int* a, int* b)
{
	/*int c = *a;
	*a = *b;
	*b = c;*/
	*a ^= *b;
	*b ^= *a;
	*a ^= *b;
}
//在ab之中取最小值
inline int min(int a, int b)
{
	return a < b ? a : b;
}
//在ab之中取最大值
inline int max(int a, int b)
{
	return a < b ? b : a;
}

//检查越界异常,在编写排序算法时,容易出现下标越界,以此作为检查手段
inline int inRange(int x, int min, int max)
{
	int res = x >= min && x <= max;
	if (!res) printf("越界:%d  界限:[%d,%d]\n", x, min, max);
	return res;
}
//用于int的高效指数计算
inline int intpow(int a, int b)
{

	int r = 1;
	for (int i = 0; i < b; i++) r *= a;

	return r;
}

//取得一个数在十进制下的位数
inline int getbitCount(int c)
{
	int bc = 0;

	do
	{
		bc++;
	} while (c = c / 10);

	return bc;
}

//获取x的第c位
inline int getbit(int x, int c)
{
	// v = (x % 100) / 10^c-1
	return (x % intpow(10, c)) / intpow(10, c - 1);
}

测试函数

我们在sort函数里给出排序算法的实现

#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>
#include<time.h>
#include<malloc.h>
#include<string.h>
#include "sort.h"





//检查数组有序性
bool checkArraySort(int* nums, int numsSize, bool* upper)
{
	int resultA = true;
	for (int i = 0; i < numsSize - 1; i++)
	{
		if (nums[i] > nums[i + 1])
		{
			//printf("无序数对下标:[%d,%d]\n", i, i + 1);
			resultA = false;
		}
	}

	if (resultA)
	{
		*upper = true;
		return resultA;
	}

	int resultB = true;
	for (int i = 0; i < numsSize - 1; i++)
	{
		if (nums[i] < nums[i + 1])
		{
			resultB = false;
		}
	}
	if (resultB)
	{
		*upper = false;
		return resultB;
	}
	return false;
}
//输出数组元素
void printElements(int* nums, int count)
{
	for (int i = 0; i < count; i++)
	{
		printf("%d", nums[i]);
		if (i < count - 1) printf(",");
	}
	printf("\n");
}
//随机生成数组
void randomArray(int* nums, int numsSize, int min, int max)
{
	srand(time(0));
	for (int i = 0; i < numsSize; i++)
	{
		nums[i] = rand() % max - min + 1 + min;
		//printf("%d,", nums[i]);
	}

}
int sort(int* arr, int size)
{
	quickSort(arr, size);
}

int main()
{
	//常量:测试数据大小,随机最小值,随机最大值
	const int size = 10000;
	const int min = 0;
	const int max = 10000;

	//预分配测试数据,临时空间数组,随机备份数组
	int* arr = malloc(sizeof(int) * size);
	int* tempArr = malloc(sizeof(int) * size);
	int* copy = malloc(sizeof(int) * size);
	randomArray(arr, size, min, max);
	memcpy(copy, arr, sizeof(int) * size);

	//计时器
	clock_t start, end;
	start = clock();
	//排序
	sort(arr,size);
	end = clock();
	end -= start;


	bool upper;
	//测试数据有序性检查
	bool res = checkArraySort(arr, size, &upper);

	//输出排序报告
	printf("========排序测试报告========\n");
	printf("元素数量:%d\n", size);
	printf("排序后有序检查(%s):%d\n", upper ? "升序" : "降序", res);
	printf("排序耗时(tick):%d\n", (int)end);
	printf("排序耗时(ms):%f\n", (double)(end * 1000) / CLOCKS_PER_SEC);
	printf("排序耗时(s):%f\n", (double)end / CLOCKS_PER_SEC);

	printf("\n是否打印排序前后元素(IO操作可能产生较大的耗时)(Y/N)?\n");
	char option;
	int inputC = scanf("%c", &option);
	if (option == 'Y' || option == 'y')
	{
		printf("\n排序前:");
		printElements(copy, size);
		printf("排序后:");
		printElements(arr, size);
	}
}

在第一篇中,我们首先做这些内容,接下来我们就能心无旁骛的编写排序函数了。
下文的链接如果写完会继续贴在这里(代码写完了,原理还没写)
传送门:十种排序算法(1) xxx

在这里插入图片描述

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

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

相关文章

Kibana无法启动 kibana_task_manager search_phase_execution_exception 问题解决

今天服务器重启以后&#xff0c;发现无法启动Kibana服务了&#xff0c;在网上也是把错误搜索了半天&#xff0c;尝试了那些命令&#xff0c;但是执行删除命令时居然报错了。后来&#xff0c;仔细观察后&#xff0c;发现是删除方式不太正确&#xff0c;需要改一下删除命令才能正…

Java on Azure Tooling 9月更新|Azure OpenAI 服务和 Playground 支持及更多

作者&#xff1a;Jialuo Gan - Program Manager, Developer Division at Microsoft 排版&#xff1a;Alan Wang 大家好&#xff0c;欢迎阅读 Java on Azure 开发者工具九月份更新。在本次更新中&#xff0c;我们将介绍对 Azure OpenAI 服务和 Playground 的支持&#xff0c;开发…

python创建个人交易策略

编写您的第一个交易策略的综合教程。 介绍 创建个人交易策略在家庭交易者和/或 Python 爱好者中变得越来越流行。本文将介绍交易策略的完整生命周期:从获取市场数据开始,计算技术指标,生成交易信号,最后评估策略的有效性。 我们将使用 Kraken API 中的美元 价格,并基于移…

Vue 报错error:0308010C:digital envelope routines::unsupported

export NODE_OPTIONS--openssl-legacy-provider linux 可以解决

dbeaver配置es连接org.elasticsearch.xpack.sql.jdbc.EsDriver

查看目标es服务版本&#xff0c;下载对应驱动

GEO生信数据挖掘(十一)STRING数据库PPI蛋白互作网络 Cytoscape个性化绘图【SCI 指日可待】

GEO生信数据挖掘&#xff08;十&#xff09;肺结核数据-差异分析-WGCNA分析&#xff08;900行代码整理注释更新版本&#xff09; 通过 前面十篇文章的学习&#xff0c;我们应该已经可以获取到一个”心仪的基因列表“了&#xff0c;相较于原始基因数量&#xff0c;这个列表的数…

解决方案|法大大电子合同加速互联网家装服务升级

随着互联网的快速发展以及政策的不断推动&#xff0c;家装行业“互联网”趋势也不断凸显。行业内很多企业已经开始在全链条业务中使用电子合同&#xff0c;基于电子合同合规化、无纸化、线上化、智能化的价值赋能&#xff0c;实现家装从需求沟通、家装设计、选材、装修施工、验…

如何在mac 安装 cocos 的 android环境

基本概念&#xff1a; Java: Java 是一种编程语言&#xff0c;由Sun Microsystems&#xff08;现在是 Oracle Corporation&#xff09;开发。Java 是一种跨平台的语言&#xff0c;可以用于开发各种应用程序&#xff0c;包括 Android 应用程序。Android 应用程序的核心代码通常用…

会声会影2024永久激活序列号密钥 CDR Keygens 2024通用注册机

Corel All Products Universal Keygens 2024通用注册机是一款非常实用的激活工具&#xff0c;专门用于激活Corel全系列产品。尤其是被广泛使用的CorelDRAW作图软件和Corel VideoStudio会声会影视频编辑处理软件。小编也是一直关注由X-Force团队制作的注册机&#xff0c;目前已更…

Vue中动态增加表单项的方法

<!-- 需求 1 根据点击添加 生成表格数据 2 动态添加 表单-->点击添加生成对应动态表单 HTML <template><div class"main"><!-- 动态添加 --><div v-for"(item, index) in dataResult" :key"index"><a-form-mo…

Swagger + DOCWAY 一步导出为优雅完整的Markdown、Pdf接口文档

只要开发&#xff0c;只要写接口应该没人不知道Swagger&#xff0c;但DOCWAY可能知道的人不多&#xff0c;但知道用过后就离不开了&#xff0c;不管是作为多方联调的接口文档&#xff0c;还是交接给客户的文档&#xff0c;都是可以的&#xff0c;具体如何使用&#xff0c;详细步…

评估在线不平衡学习的PAUC

评估在线不平衡学习的PAUC 原始论文《Prequential AUC: properties of the area under the ROC curve for data streams with concept drift》 由于正常的AUC需要计算整体数据集上&#xff0c;每个数据的预测置信度的排名。那么我们首先要求我们的在线学习算法在进行预测时也返…

Vue的动画与过度

一、Vue的动画效果 &#xff08;一&#xff09;编写CSS关键帧动画 keyframes show{from{transform: translateX(-100%);}to{transform: translateX(0px);} } &#xff08;二&#xff09;定义动画效果 .v-enter-active { animation: 配置项 } // 显示动画 .v-leave-active…

2.预备知识-2简化版

#pic_center R 1 R_1 R1​ R 2 R^2 R2 目录 知识框架No.1 数据操作数据预处理一、N维数组样例二、创建数组三、访问元素四、数据操作五、数据预处理六、D2L注意点 No.2 线性代数一、标量二、向量1、基本操作2、空间表示3、乘法 三、矩阵1、基本操作2、乘法3、空间表示4、乘法5、…

在销售区域 销售范围 <‘5100‘,‘20‘,‘00‘> 中, 订单类型 ZO05 没有定义

创建销售订单时报错&#xff0c;如上图&#xff0c;查询后台配置 SPRO-销售和分销-销售-销售凭证-销售凭证抬头-分配销售区域到销售凭证类型 对比发现ZO05没有配置这个销售范围&#xff0c;可以在此处进行配置。 通过STMS查看修改的传输请求 查看&#xff0c;传输时修改的内容…

Java架构师项目管理

目录 1 导学2 进度管理2.1 关键路径法3 软件配置管理3.1 配置项版本号4 质量管理5 风险管理想学习架构师构建流程请跳转:Java架构师系统架构设计 1 导学 2 进度管理 进度管理就是采用科学的方法,确定进度目标,编制进度计划和资源供应计划,进行进度控制,在与质量、成本目…

集简云x slack(自建)无需API开发轻松连接OA、电商、营销、CRM、用户运营、推广、客服等近千款系统

slack是一个工作效率管理平台&#xff0c;让每个人都能够使用无代码自动化和 AI 功能&#xff0c;还可以无缝连接搜索和知识共享&#xff0c;并确保团队保持联系和参与。在世界各地&#xff0c;Slack 不仅受到公司的信任&#xff0c;同时也是人们偏好使用的平台。 官网&#x…

【C/C++】关于指针变量的误区

程序运行前 ​ 在程序编译后&#xff0c;生成了exe可执行程序&#xff0c;未执行该程序前分为两个区域 ​ 代码区&#xff1a; ​ 存放 CPU 执行的机器指令 ​ 代码区是共享的&#xff0c;共享的目的是对于频繁被执行的程序&#xff0c;只需要在内存中有一份代码即可 ​ 代…

[C++入门系列]——类和对象下篇

​作者主页 &#x1f4da;lovewold少个r博客主页 ⚠️本文重点&#xff1a;C类和对象下篇知识点讲解 &#x1f449;【C-C入门系列专栏】&#xff1a;博客文章专栏传送门 &#x1f604;每日一言&#xff1a;宁静是一片强大而治愈的神奇海洋&#xff01; 目录 前言 再谈构造函数…

Compose 如何配置布局?

Compose 是一个界面工具包&#xff0c;可让您轻松实现应用的设计。您只需描述自己想要的界面外观&#xff0c;Compose 会负责在屏幕上进行绘制。 Compose布局的优势 使用Compose布局还有许多其他优势&#xff1a; 灵活性&#xff1a;Compose布局支持组合任何数量的UI元素和自…