【 选择排序 & 冒泡排序 & 插入排序 & 对数器验证 &随机数的运用】

【 选择排序 & 冒泡排序 & 插入排序 & 对数器验证 &随机数的运用】


前言

介绍选择排序、冒泡排序 、插入排序 、对数器验证(涉及随机数的产生、随机数组的产生、数组的拷贝)


函数顺序:[代码实现见示例]

1. 数值交换函数

void Swap(int* arr, int i, int j)

2.选择排序算法

void selectionSort(int* arr, int num)

3.冒泡排序算法

void BubbleSort(int* arr, int num)

4.插入排序算法

void InsertSort(int* arr, int num)

5 产生随机数组函数(数组内的值为随机值)

int* randomArray(int n, int V)

6. 数组的拷贝(malloc 申请新空间进行拷贝)

int* copyArray(int n, int* arr)

7.比较数组数值是否相同函数(对数器验证思想)

bool sameArray(int* arr, int* brr, int n)

8. 打印数组值函数

void PrintArr(int* arr, int num)

9. main函数

涉及对数器验证思路,也有简单验证思路[已被注释]

//选择 冒泡 插入排序

//对数器验证 &随机数的运用【重点】

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

//数组下标i,j所在的两个数据交换 
void Swap(int* arr, int i, int j)
{
	int temp = arr[i];
	arr[i] = arr[j];
	arr[j] = temp;
}

//选择排序排序 
void selectionSort(int* arr, int num)
{
	if (arr == NULL || num < 2)
		return;
	for (int minIndex, i = 0; i < num - 1; i++)
	{	//minIndex : i ~num-1范围上,最小值所在位置
		//初始默认i位置为最小值 
		minIndex = i;
		//经过遍历 得到i+1~num内最小值与i位置比较(进行最小值选择),判断是否需要交换 
		for (int j = i + 1; j < num; j++)
		{
			if (arr[j] < arr[minIndex])
			{
				minIndex = j;
			}
		}
		//判断是否交换 进行选择排序 
		Swap(arr, i, minIndex);
	}
}

//冒泡排序算法 
void BubbleSort(int* arr, int num)
{
	if (arr == NULL || num < 2)
		return;
	for (int i = 0; i < num - 1; i++)
	{
		for (int j = i + 1; j < num; j++)
		{
			if (arr[i] > arr[j])
			{
				Swap(arr, i, j);
			}
		}
	}
}

//插入排序
void InsertSort(int* arr, int num)
{
	if (arr == NULL || num < 2)
		return;
	for (int i = 1; i < num; i++)
	{//0~i-1已经有序,新来的数是[i],向左看 
		for (int j = i - 1; j >= 0 && arr[j] > arr[j + 1]; j--)
		{
			//j+1一直是当前插入数的位置 
			//j永远是当前数的前一个位置 
			Swap(arr, j, j + 1);
		}
	}
}

//main函数使用对数器方法验证三种排序是否正确

//得到一个随机数值 长度为n
//数组中每个数,都在1~V之间 随机得到
int* randomArray(int n, int V)
{
	int* arr = (int*)malloc(sizeof(int) * n);
	time_t t;
	time(&t);
	srand((unsigned int)t);
	for (int i = 0; i < n; i++)
	{
		arr[i] = rand() % V + 1;
	}
	return arr;
}

//为了验证  另外开辟空间拷贝数组
int* copyArray(int n, int* arr)
{
	int* ans = (int*)malloc(sizeof(int) * n);
	for (int i = 0; i < n; i++)
	{
		ans[i] = arr[i];
	}
	return ans;
}

//对数器为了验证方法是否正确,检验数组数据是否相同
bool sameArray(int* arr, int* brr, int n)
{
	for(int i = 0; i < n; i++)
	{
		if (arr[i] != brr[i])
			return false;
	}
	return true;
}

//打印数组数据 
void PrintArr(int* arr, int num)
{
	for (int i = 0; i < num; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}


int main()
{
	//随机数组最大长度 
	int N = 5;
	//随机数组每个值 在1~V之间 
	int V = 10;
	//testTimes :测试次数 
	int testTimes = 50;

	printf("测试开始:");

	time_t t;
	time(&t);
	srand((unsigned int)t);

	for (int i = 0; i < testTimes; i++)
	{
		//随机得到一个长度,长度在[0,V]
		int n = rand() % V + 1;
		//得到随机数组
		int* arr = randomArray(n, V);
		int* b = copyArray(n, arr);
		int* c = copyArray(n, arr);
		int* d = copyArray(n, arr);
		selectionSort(b,n);
		BubbleSort(c, n);
		InsertSort(d, n);
		if (!sameArray(b, c, n) || !sameArray(c, d, n))
		{
			printf("出错了!");
			/*当出现错误
			  打印是随机生成的出错例子
			  打印三个功能,各自排序成了什么样
			  可能要把例子带入每个方法,去debug 可验证三种排序是否正确
			*/
		}
	}
	printf("测试结束\n");
//简单验证三种排序方法是否正确:
/*
	int a[5] = { 1,5,2,4,3 };
	int n = sizeof(a) / sizeof(a[0]);
	printf("原数组顺序:");
	PrintArr(a, n);

	printf("选择排序算法结果:");
	selectionSort(a, n);
	PrintArr(a, n);

	int b[5] = { 1,5,2,4,3 };
	printf("冒泡排序算法结果:");
	BubbleSort(b, n);
	PrintArr(b, n);

	int c[5] = { 1,5,2,4,3 };
	printf("插入排序算法结果:");
	InsertSort(c, n);
	PrintArr(c, n);

*/
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值