算法实验2.2、2.3

2.2主要内容

比较快速排序,归并排序以及堆排序算法的时间效率。了解影响算法执行时间的 主要因素以及如何降低算法的执行时间。 

#include<iostream>
using namespace std;
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<time.h>
#include <sys/timeb.h>
#include"string.h"
#pragma warning(disable : 4996)

typedef struct RedType {
	int key;
}RedType;
typedef struct SqList {
	RedType* r;
	int Length;
}SqList;

SqList* CreateRandomSqList(int sqListLen) {
	SqList* sq;
	int i;
	sq = (SqList*)malloc(sizeof(SqList));
	//输入序列长度
	sq->Length = sqListLen;
	sq->r = (RedType*)malloc(sizeof(RedType) * (sq->Length + 1)); //给序列的每个元素分配空间
	srand((unsigned)(time(NULL)));
	for (i = 1; i <= sq->Length; i++) {
		sq->r[i].key = int(rand());
	}
	return sq;  //返回序列起始地址
}
//创建一个与csp一样的存储空间
SqList* CopyRandomSqList(SqList* csp) {
	SqList* sq;
	int i;
	sq = (SqList*)malloc(sizeof(SqList));
	//输入序列长度
	sq->Length = csp->Length;
	sq->r = (RedType*)malloc(sizeof(RedType) * (sq->Length + 1)); //给序列的每个元素分配空间
	for (i = 1; i <= sq->Length; i++) {
		sq->r[i].key = csp->r[i].key;
	}
	return sq;  //返回序列起始地址
}
void WritetoFile(int num, int sortTime[], FILE* fp) {
	char ch[20];
	for (int i = 0; i < num; i++) {
		_itoa_s(sortTime[i], ch, 10);
		strcat_s(ch, ",");
		fwrite(ch, sizeof(char), strlen(ch), fp);
	}
	fwrite("\n", sizeof(char), 1, fp);
}

//快速排序
void QuickSort(RedType q[], int l, int r) {
	if (l >= r)return;
	int i = l - 1, j = r + 1, x = q[l + r >> 1].key;
	while (i < j) {
		do i++; while (q[i].key < x);
		do j--; while (q[j].key > x);
		if (i < j)swap(q[i].key, q[j].key);
	}
	QuickSort(q, l, j);
	QuickSort(q, j + 1, r);
}
//堆排序
void HeapAdjust(RedType* SR, int s, int m)//一次筛选的过程
{
	int rc, j;
	rc = SR[s].key;
	for (j = 2 * s; j <= m; j = j * 2)//通过循环沿较大的孩子结点向下筛选
	{
		if (j < m&& SR[j].key < SR[j + 1].key) j++;//j为较大的记录的下标
		if (rc > SR[j].key) break;
		SR[s] = SR[j]; s = j;
	}
	SR[s].key = rc;//插入
}
void HeapSort(RedType* SR, int n)
{
	int temp, i, j;
	for (i = n / 2; i > 0; i--)//通过循环初始化顶堆
	{
		HeapAdjust(SR, i, n);
	}
	for (i = n; i > 0; i--)
	{
		temp = SR[1].key;
		SR[1].key = SR[i].key;
		SR[i].key = temp;//将堆顶记录与未排序的最后一个记录交换
		HeapAdjust(SR, 1, i - 1);//重新调整为顶堆
	}
}
//归并排序
void aMerge(RedType* SR, int i, int m, int n) {
	int j, k;
	for (j = m + 1; j <= n; j++) {
		if (SR[j].key <= SR[j - 1].key) {
			int temp = SR[i].key;
			for (k = j - 1; temp < SR[k].key && k >= i; --k)
				SR[k + 1].key = SR[k].key;
			SR[k + 1].key = temp;
		}
	}
	return;
}
void aMSort(RedType* SR, int s, int t)
{
	if (s < t) {
		int mid = (s + t) / 2;
		aMSort(SR, s, mid);
		aMSort(SR, mid + 1, t);
		aMerge(SR, s, mid, t);
	}
	return;
}
void MergeSort(SqList* L) {
	aMSort(L->r, 1, L->Length);
	return;
}

int main() {

	SqList* L, * L1, * L2;
	struct __timeb64 stime, etime;
	long int rmtime, rstime;
	char ch[20];
	int quickSortTime[105], mergeSortTime[105], heapSortTime[105];
	FILE* fp;
	fp = fopen("Curv.csv", "w");

	for (int i = 10000; i <= 1000000; i = i + 10000) {
		_itoa_s(i, ch, 10);
		strcat_s(ch, ",");
		fwrite(ch, sizeof(char), strlen(ch), fp);
	}
	fwrite("\n", sizeof(char), 1, fp);
	int k = 0;
	for (int i = 10000; i <= 1000000; i = i + 10000) {
		L = CreateRandomSqList(i);
		L1 = CopyRandomSqList(L);
		L2 = CopyRandomSqList(L);
		//归并排序
		_ftime64_s(&stime);
		MergeSort(L);
		_ftime64_s(&etime);
		free(L->r);
		free(L);
		rstime = etime.time - stime.time;
		rmtime = rstime * 1000;
		rmtime += etime.millitm - stime.millitm;
		mergeSortTime[k] = rmtime;

		//快速排序
		_ftime64_s(&stime);
		QuickSort(L1->r, 0, L1->Length - 1);
		_ftime64_s(&etime);
		free(L1->r);
		free(L1);
		rstime = etime.time - stime.time;
		rmtime = rstime * 1000;
		rmtime += etime.millitm - stime.millitm;
		quickSortTime[k] = rmtime;

		//堆排序
		_ftime64_s(&stime);
		HeapSort(L2->r, L2->Length - 1);
		_ftime64_s(&etime);
		free(L2->r);
		free(L2);
		rstime = etime.time - stime.time;
		rmtime = rstime * 1000;
		rmtime += etime.millitm - stime.millitm;
		heapSortTime[k] = rmtime;
		k++;
	}
	WritetoFile(100, mergeSortTime, fp);
	WritetoFile(100, quickSortTime, fp);
	WritetoFile(100, heapSortTime, fp);
	fclose(fp);
	return 1;
}

2.3主要内容 

 学习分析递归程序结构的时间复杂度和影响算法运行时间的因素。

#include<iostream>
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<time.h>
#include <sys/timeb.h>
#include"string.h"
#pragma warning(disable : 4996)
#define M 4
#define N 15
using namespace std;

class Color {
	friend int mColoring(int, int, int**);
public:
	bool Ok(int k);
	void Backtrack(int k);
	int n, m, ** a, * x;
	long sum;
};
long long  cifang(int n,int m)
{
	int count = 0;long long c = 1;
	for (int i = 0; i < n; i++)
	{

		c = c*(m/2);//防止时间复杂度太大了,进行缩小
		count++;
	}
	return c;
}
void WritetoFile(int num, int sortTime[], FILE* fp) {
	char ch[20];
	for (int i = 0; i < num; i++) {
		_itoa_s(sortTime[i], ch, 10);
		strcat_s(ch, ",");
		fwrite(ch, sizeof(char), strlen(ch), fp);
	}
	fwrite("\n", sizeof(char), 1, fp);
}
int mColoring(int, int, int**);
int main() {
	int n, m, ** a, sum; long long timecom{ 0 };
	//cout << "Please input the number of colors:";
	//cin >> m;

	struct __timeb64 stime, etime;
	long int rmtime, rstime;
	char ch[20];
	int paintTime[105]{0};
	FILE* fp;
	fp = fopen("Curv.csv", "w");

	for (int i = 5; i <= N; i = i + 1) {
		_itoa_s(i, ch, 10);
		strcat_s(ch, ",");
		fwrite(ch, sizeof(char), strlen(ch), fp);
	}
	fwrite("\n", sizeof(char), 1, fp);

	int k{ 0 };
	/*for (int i = 5; i <= N; i = i + 1) {

		//cout << "Please input the number of nodes:";
		n=i;
		a = new int* [n + 1];
		for (int i = 0; i <= n; i++) {
			a[i] = new int[n + 1];
		}
		//cout << "Please input the ralation of nodes:1-->Connected,0-->Not connected";
		for (int i = 1; i <= n; i++) {
			for (int j = i + 1; j <= n; j++) {
				//cout << "please input the ralation of" << i << "and" << j << ":";
				//cin >> a[i][j];
				//a[i][j] = 1;//完全图,最外面的i循环换成 i <= M,注意要改四处
				a[i][j] = 0;//一条边都没有,最外面的i循环换成 i <= N
				a[j][i] = a[i][j];
			}
		}
		_ftime64_s(&stime);

		sum = mColoring(n, M, a);

		_ftime64_s(&etime);

		rstime = etime.time - stime.time;
		rmtime = rstime * 1000;
		rmtime += etime.millitm - stime.millitm;
		paintTime[k] = rmtime;
		k++;

		delete[]a;
	}

	WritetoFile(11, paintTime, fp);

	for (int i = 5; i <= N; i = i + 1)
	{
		timecom = i * cifang(i,M);

		_itoa_s(timecom, ch, 10);
		strcat_s(ch, ",");
		fwrite(ch, sizeof(char), strlen(ch), fp);
	}
	fwrite("\n", sizeof(char), 1, fp);*/

	k = 0;
	n = 10;
	for (int j = 5; j <= N; j = j + 1) {

		//cout << "Please input the number of nodes:";
		m = j;
		a = new int* [n + 1];
		for (int i = 0; i <= n; i++) {
			a[i] = new int[n + 1];
		}
		//cout << "Please input the ralation of nodes:1-->Connected,0-->Not connected";
		for (int i = 1; i <= n; i++) {
			for (int j = i + 1; j <= n; j++) {
				//cout << "please input the ralation of" << i << "and" << j << ":";
				//cin >> a[i][j];
				//a[i][j] = 1;//完全图,注意要改四处
				a[i][j] = 0;//一条边都没有
				a[j][i] = a[i][j];
			}
		}
		_ftime64_s(&stime);

		sum = mColoring(n, m, a);

		_ftime64_s(&etime);

		rstime = etime.time - stime.time;
		rmtime = rstime * 1000;
		rmtime += etime.millitm - stime.millitm;
		paintTime[k] = rmtime;
		k++;

		delete[]a;
	}

	WritetoFile(11, paintTime, fp);

	for (int i = 5; i <= N; i = i + 1)
	{
		timecom = n * cifang(n,i);

		_itoa_s(timecom, ch, 10);
		strcat_s(ch, ",");
		fwrite(ch, sizeof(char), strlen(ch), fp);
	}
	fwrite("\n", sizeof(char), 1, fp);

	fclose(fp);

	//cout << sum << endl;
	return 1;
}
bool Color::Ok(int k)
{
	for (int j = 1; j <= n; j++)
		if ((a[k][j] == 1 && x[j] == x[k]))
			return false;
	return true;
}
void Color::Backtrack(int t) {
	if (t > n) {
		sum++;
		/*for (int i = 1; i <= n; i++)
			cout << x[i] << " ";
		cout << endl;*/
	}
	else {
		for (int i = 1; i <= m; i++) {
			x[t] = i;
			if (Ok(t))Backtrack(t + 1);
			x[t] = 0;
		}
	}
}
int mColoring(int n, int m, int** a) {
	Color X;
	X.n = n;
	X.m = m;
	X.a = a;
	X.sum = 0;
	int* p = new int[n + 1];
	for (int i = 0; i <= n; i++)p[i] = 0;
	X.x = p;
	X.Backtrack(1);
	delete[]p;
	return X.sum;
}

时间复杂度分析:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CGuts350

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值