算法实验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 <= Na[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;
}

时间复杂度分析:

 

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

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

相关文章

【论文阅读】-- 研究时间序列可视化,提升用户体验

Investigating Time Series Visualisations to Improve the User Experience 摘要1 引言2 相关工作互动技巧视觉编码坐标系 3 用户研究时间序列可视化互动技巧任务实验设计 4 结果交互技术的效果视觉编码的影响坐标系的影响 5 讨论交互技术的效果视觉编码的影响坐标系的影响 6 …

芒果YOLOv10改进122:注意力机制系列:最新结合即插即用CA(Coordinate attention) 注意力机制,CVPR 顶会助力分类检测涨点!

论文所提的Coordinate注意力很简单,可以灵活地插入到经典的移动网络中,而且几乎没有计算开销。大量实验表明,Coordinate注意力不仅有益于ImageNet分类,而且更有趣的是,它在下游任务(如目标检测和语义分割)中表现也很好。本文结合目标检测任务应用 应专栏读者的要求,写一…

cube-studio开源一站式机器学习平台,在线ide,jupyter,vscode,matlab,rstudio,ssh远程连接,tensorboard

全栈工程师开发手册 &#xff08;作者&#xff1a;栾鹏&#xff09; 一站式云原生机器学习平台 前言 开源地址&#xff1a;https://github.com/tencentmusic/cube-studio cube studio 腾讯开源的国内最热门的一站式机器学习mlops/大模型训练平台&#xff0c;支持多租户&…

【Linux】:环境变量

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下有关Linux环境变量的相关知识点&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门…

mac|浏览器链接不上服务器但可以登微信

千万千万千万不要没有关梯子直接关机&#xff0c;不然就会这样子呜呜呜 设置-网络&#xff0c;点击三个点--选择--位置--编辑位置&#xff08;默认是自动&#xff09; 新增一个&#xff0c;然后选中点击完成 这样就可以正常上网了

【嵌入式DIY实例】- LCD ST7735显示DHT11传感器数据

LCD ST7735显示DHT11传感器数据 文章目录 LCD ST7735显示DHT11传感器数据1、硬件准备与接线2、代码实现本文介绍如何将 ESP8266 NodeMCU 板 (ESP-12E) 与 DHT11 (RHT01) 数字湿度和温度传感器连接。 NodeMCU 从 DHT11 传感器读取温度(以 C 为单位)和湿度(以 rH% 为单位)值,…

计算机网络-第5章运输层

5.1运输层协议概述 5.1.1进程之间的通信 运输层向它上面的应用层提供通信服务&#xff0c;它属于面向通信部分的最高层&#xff0c;同时也是用户功能中的最低层。 通信的两端应当是两个主机中的应用进程。 运输层复用和分用&#xff1a;复用指在发送方不同的应用进程都可以…

【机器学习】FFmpeg+Whisper:二阶段法视频理解(video-to-text)大模型实战

目录 一、引言 二、FFmpeg工具介绍 2.1 什么是FFmpeg 2.2 FFmpeg核心原理 2.3 FFmpeg使用示例 三、FFmpegWhisper二阶段法视频理解实战 3.1 FFmpeg安装 3.2 Whisper模型下载 3.3 FFmpeg抽取视频的音频 3.3.1 方案一&#xff1a;命令行方式使用ffmpeg 3.3.2 方案二&a…

基于协同过滤的电影推荐与大数据分析的可视化系统

基于协同过滤的电影推荐与大数据分析的可视化系统 在大数据时代&#xff0c;数据分析和可视化是从大量数据中提取有价值信息的关键步骤。本文将介绍如何使用Python进行数据爬取&#xff0c;Hive进行数据分析&#xff0c;ECharts进行数据可视化&#xff0c;以及基于协同过滤算法…

SuperMap GIS基础产品FAQ集锦(20240701)

一、SuperMap iDesktopX 问题1&#xff1a;对于数据提供方提供的osgb格式的数据&#xff0c;如何只让他生成一个s3mb文件呢&#xff1f;我用倾斜入库的方式会生成好多个s3mb缓存文件 11.1.1 【解决办法】不能控制入库后只生成一个s3mb文件&#xff1b;可以在倾斜入库的时候设…

2024第17届中国西部(重庆)留学移民海外置业展览会

2024第17届中国西部&#xff08;重庆&#xff09;留学移民海外置业展览会 邀请函 主办单位&#xff1a; 中国西部教体医融合博览会组委会 承办单位&#xff1a;重庆中博展览有限公司 展会背景&#xff1a; 成都和重庆是中国新一线城市&#xff0c;是西部经济的核心增长极&a…

代码随想录算法训练营第59天:动态[1]

代码随想录算法训练营第59天&#xff1a;动态 两个字符串的删除操作 力扣题目链接(opens new window) 给定两个单词 word1 和 word2&#xff0c;找到使得 word1 和 word2 相同所需的最小步数&#xff0c;每步可以删除任意一个字符串中的一个字符。 示例&#xff1a; 输入: …

实施粘贴式导航_滚动事件

● 所谓的粘贴式导航&#xff0c;就是当我们滑动页面到某一个位置的时候&#xff0c;导航不会因为滑动而消失&#xff0c;会固定在页面的顶部&#xff0c;我们来看一下如何实现&#xff1b; ● 首先我们要获取我们想要滚动到哪一部分的时候让导航栏显示出来&#xff0c;这就需要…

Java案例抢红包

目录 一&#xff1a;题目要求&#xff1a; 二&#xff1a;思路分析&#xff1a;&#xff08;遇见问题先想出完整的思路逻辑再去动手事半功倍&#xff09; 三&#xff1a;具体代码&#xff1a; 一&#xff1a;题目要求&#xff1a; 二&#xff1a;思路分析&#xff1a;&#x…

Cosine 余弦相似度并行计算的数学原理与Python实现

背景 Cosine 我在LLM与RAG系列课程已经讲了很多次了&#xff0c;这里不在熬述&#xff0c;它在LLM分析中&#xff0c;尤其是在语义相似度的计算中至关重要&#xff0c;在dot attention机制中&#xff0c;也会看到他的身影。这里讲的是纯数学上的运算与python是如何运用相关库进…

JS(JavaScript)的BOM操作

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

一文汇总VSCode多光标用法

光标的创建 按住alt&#xff0c;鼠标左键单击&#xff0c;在单击位置生成光标/删除光标 按住ctrlalt&#xff0c;单击↑/↓&#xff0c;在每行同一个位置&#xff08;若某一行较短&#xff0c;则在行尾&#xff09;生成光标&#xff0c;这个不会删除光标&#xff0c;只会在光标…

Day61 代码随想录打卡|回溯算法篇---组合优化

本篇是针对上一题的优化&#xff0c;因为在计算所有可能的组合结果时&#xff0c;不是每一条路径都是我们需要遍历的&#xff0c;如图&#xff0c;当n和k都为4的时候&#xff0c;其实最终的结果只有一个[1,2,3,4]是符合结果的。因此我们遍历的时候就不需要遍历每一条边&#xf…

Go线程实现模型-G

G 概述 一个G就代表一个goroutine(或称Go例程)&#xff0c;也与go函数相对应。作为编程人员&#xff0c;我们只是使用go语句向Go的运行时系统提交一个并发任务&#xff0c;而Go的运行时系统则会按照我们要求并发地执行它 Go编译器会把go语句变成对内部函数newproc的调用&…

美德政府转移比特币、以太坊引发市场下跌

小编通过链上地址监控&#xff0c;令人意外的发现德国和美国政府都进行了大规模的数字货币转移&#xff0c;转移了价值 1.5 亿美元的比特币和以太坊。这些大额转移势必引起了数字货币市场分析师和投资者的关注。 BTC价格 从今年起德国政府已转移了其持有的相当一部分比特币&…