C语言实现对数器——以冒泡排序和插入排序为例

 

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

typedef struct Arr
{
	int* pBase;
	int len;
}ARR, *PARR;

void generate_arr(PARR pArr, int maxSize, int maxVal);
void copy_arr(PARR pArr1, PARR pArr2);
bool traverse(PARR pArr);
void swap(int* arr, int i, int j);
void bubble_sort(PARR pArr1);
void insertion_sort(PARR pArr2);
bool compare(PARR pArr1, PARR pArr2);



int main()
{
	ARR Arr1, Arr2;
	int maxSize = 500;
	int maxVal = 500;
	int times = 500;
	bool succeed = true;
	for (int i = 0; i <= times; i++)
	{
		generate_arr(&Arr1, maxSize, maxVal);
		copy_arr(&Arr1, &Arr2);
		bubble_sort(&Arr1);
		insertion_sort(&Arr2);
		if (!compare(&Arr1, &Arr2))
		{
			succeed = false;
			break;
		}
		free(Arr1.pBase);
		free(Arr2.pBase);

	}
	if (succeed)
		printf("成功!\n");
	else
		printf("失败!\n");
	/*traverse(&Arr1);
	printf("\n");
	traverse(&Arr2);*/
	
	/*traverse(&Arr1);
	printf("\n");
	traverse(&Arr2);
	printf("\n");*/
	
	/*traverse(&Arr1);
	printf("\n");
	traverse(&Arr2);*/
	
	return 0;
}

void generate_arr(PARR pArr, int maxSize, int maxVal)
{
	srand((unsigned)time(NULL));
	pArr->len = rand() % (maxSize + 1);
	pArr->pBase = (int*)malloc(sizeof(int) * pArr->len);

	for (int i = 0; i <= pArr->len - 1; i++)
	{
		pArr->pBase[i] = rand() % (maxVal + 1);
	}

	return;
}

bool traverse(PARR pArr)
{
	if (pArr->pBase == NULL)
		return false;
	else
	{
		for (int i = 0; i <= pArr->len - 1; i++)
		{
			printf("%d\t", pArr->pBase[i]);
		}
		return true;
	}
		
}

void copy_arr(PARR pArr1, PARR pArr2)
{
	pArr2->len = pArr1->len;
	pArr2->pBase = (int*)malloc(sizeof(int) * pArr2->len);

	for (int i = 0; i <= pArr2->len - 1; i++)
	{
		pArr2->pBase[i] = pArr1->pBase[i];
	}

	return;
}

void swap(int* arr, int i, int j)
{
	arr[i] = arr[i] ^ arr[j];
	arr[j] = arr[i] ^ arr[j];
	arr[i] = arr[i] ^ arr[j];
	return;
}

void bubble_sort(PARR pArr1)
{
	if (pArr1->pBase == NULL || pArr1->len < 2)
		return;

	for (int i = pArr1->len - 1; i >= 0; i--)
	{
		for (int j = 0; j < pArr1->len - 1; j++)
		{
			if (pArr1->pBase[j] > pArr1->pBase[j + 1])
				swap(pArr1->pBase, j, j + 1);
		}
	}
	return;
}

void insertion_sort(PARR pArr2)
{
	if (pArr2->pBase == NULL || pArr2->len < 2)
		return;

	for (int i = 1; i <= pArr2->len ; i++)
	{
		for (int j = i - 1; j > 0 && pArr2->pBase[j] < pArr2->pBase[j - 1]; j--)
		{
			swap(pArr2->pBase, j, j - 1);
		}
	}
	return;
}

bool compare(PARR pArr1, PARR pArr2)
{
	int i;
	bool equ = true;

	for ( i = 0; i <= pArr1->len - 1; i++)
	{
		if (pArr1->pBase[i] != pArr2->pBase[i])
		{
			equ = false;
			break;
		}
	}

	return equ;
}

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值