当前位置: 首页 > article >正文

算法 class 005 (对数器C语言实现)

 对数器的概念:

用来测试你的算法是否正确。

怎么做呢?

        1:比如,写个冒泡排序,作为对比的对象

        2:生成一个随机数 数组,用来测试

        3:用冒泡排序和你想要验证的那个排序算法,同时对这个数组排序,所以这个数组我们需要两份一样的。

        4:需要验证一个验证函数验证

        5:多次生成随机数组,然后排序验证,如果都没有出错,大概率你写的那个排序就是正确的

1、生成随机数组

 1、定义时间时间戳,以及两个变量,一个用来生成数组的长度,一个用来生成每一个元素的大小

2、定义一个变量表示本次的数组范围然后用一个函数来生成这个随机数组

生成随机数组函数

2、拷贝数组

arr1 是生成的随机数组,可以直接使用,也可以多拷贝一份,我这里直接使用,所以两个数组就够了,待会用冒泡排序和插入排序比较。

 拷贝函数

3、排序

 用 冒泡排 arr1; 这俩排序在 class 004文章中

 用 插入排 arr2;

4、写验证函数验证

函数的返回值是 bool类型的,如果为真(fruit 非 0值),表示你的测试方法这一次通过了

 

验证函数

5、多次测试

只需要再定义一个变量套在外面就行

#define	_CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <time.h>
#if 1;
void Swap(int* arr, int x, int y)
//x y 为下标
{
	int tmp = arr[x];
	arr[x] = arr[y];
	arr[y] = tmp;

}
void BubbleSort(int* arr, int size)//冒泡排序
{
	//if (arr == NULL || size < 2) return;
	for (int i = size - 1; i > 0; i--)
	{	// i 用来放入最大值

		int count = 0;//用来计数,如果提前排好序了,就提前结束
		for (int j = 0; j < i; j++)
		{	// j 用来比较两个数
			if (arr[j] > arr[j + 1])
			{//如果 j 大与 j 后一个数
				Swap(arr, j, j + 1);//就交换
				count++;//计数器加1
			}

		}
		if (count == 0)
			break;
	}
}

void InsertSort(int* arr, int size)//插入排序
{
	//if (arr == NULL || size < 2) return;
	for (int i = 1; i < size; i++)
	{
		for (int j = i; j > 0; j--)
		{
			if (arr[j] < arr[j - 1])
			{
				Swap(arr, j, j - 1);
			}
			else
				j = 0;
		}
	}
}

int* randomArray(n, V)//生成随机数组
{
	int* arr = (int*)malloc(n * sizeof(int));//开辟 n 个int类型的空间
	if (arr == NULL)
	{
		perror("randomArray-malloc::failed");
		exit(EOF);
	}
	for (int i = 0; i < n; i++)//循环 n 次
	{
		arr[i] = rand() % V+1;//每次放入一个大小在 [0 ~ V-1]之间的数

	}
	return arr;//返回该地址
}
int* copyArray(int n,int* arr1)//拷贝数组
{
	int* arr2 = (int*)malloc(n * sizeof(int));//开辟一个 n 个 int 类型的地址
	if (arr2 == NULL)
	{
		perror("randomArray-malloc::failed");
		exit(EOF);
	}
	for (int i = 0; i < n; i++)
	{
		arr2[i] = arr1[i];//将 arr1 中的每一给元素赋值给 arr2,就算拷贝完成了
	}
	return arr2;//返回 arr2 的地址

}

bool sameArray(int* arr1, int* arr2, int n)
{
	for (int i = 0; i < n; i++)
	{
		if (arr1[i] != arr2[i])//每一个元素作比较
			return false;//如果有不一样的就返回 false
	}
	return true;//一个都没有返回 ture
}
void PrintArray(int* arr,int*arr2 ,int size)
{
	for (int i = 0; i < size; i++)
	{
		printf("%d %d", arr[i], arr2[i]);
		printf("\n");
	}
	
}

int main()
{
	srand((unsigned int)time(NULL));
	int N = 30;       // 随机数组最大长度
	int V = 1000;      // 随机数组每个值范围
	int times = 20;
	for (int i = 0; i < times; i++)
	{
		printf("测试开始\n");
		int n = rand() % N + 1; //本次的数组大小,范围[1 ~ N-1] 	
		int* arr1 = randomArray(n, V);//生成随机数数组
		int* arr2 = copyArray(n, arr1);//拷贝一份

		BubbleSort(arr1, n);
		InsertSort(arr2, n);
		bool fruit = sameArray(arr1, arr2, n);
		if (fruit)
		{
			printf("测试通过 - %d\n\n", i);
			PrintArray(arr1, arr2, n);
			free(arr1);
			free(arr2);
		}
		else
		{
			printf("测试失败 - %d\n\n", i);
			free(arr1);
			free(arr2);
			return EOF;
		}
	}
	return 0;
}


http://www.kler.cn/a/464787.html

相关文章:

  • 第一次作业
  • Java项目常见基础问题汇总(6)
  • 基于Golang的网络安全靶场设计与实现
  • 利用深度学习进行系统健康监控:智能运维的新纪元
  • Vue 中el-table-column 进行循环,页面没渲染成功
  • 并联带阻滤波器带通滤波器对幅值和相位的影响(IIR)
  • C++ 设计模式:组合模式(Composite Pattern)
  • QT----------多媒体
  • HarmonyOS Next ArkUI @State @Prop @Link @Provide @Consume笔记
  • EasyExcel简介和读写操作
  • IoC设计模式详解:控制反转的核心思想
  • PyTorch 中 coalesce() 函数详解与应用示例
  • Linux之ARM(MX6U)裸机篇----6.BSP工程管理实验
  • Vue 自定义指令
  • 全国知名网络安全赛事西湖论剑·杭州网络安全技能大赛启动报名
  • 【C++/CMake】从静态库到动态库:一行改动解决 “找不到 -ljsoncpp” 链接报错
  • 第二十六天 自然语言处理(NLP)词嵌入(Word2Vec、GloVe)
  • TTL 传输中过期问题定位
  • 【网络协议】路由信息协议 (RIP)
  • 【PyTorch][chapter 28][李宏毅深度学习][Diffusion Model-2]