第二周-项目3
来源:互联网 发布:淘宝买东西非实名认证 编辑:程序博客网 时间:2024/05/18 02:48
/* * Copyright (c) 2017,烟台大学计算机学院 * All right reserved. * 文件名称:main.cpp * 作者:于嵩 * 完成日期:2017年9月20日 * 版本号:v1.0 * * 问题描述:体验复杂度 * 输入描述:标准函数输入 * 程序输出:标准函数输出*/
(1)两种排序算法的运行时间
排序是计算机科学中的一个基本问题,产生了很多种适合不同情况下适用的算法,也一直作为算法研究的热点。本项目提供两种排序算法,复杂度为
将比较时间差异。
//第一种算法#include <stdio.h>#include <time.h>#include <stdlib.h>#define MAXNUM 100000void selectsort(int a[], int n){int i, j, k, tmp;for (i = 0; i < n - 1; i++){k = i;for (j = i + 1; j < n; j++){if (a[j] < a[k])k = j;}if (k != j){tmp = a[i];a[i] = a[k];a[k] = tmp;}}}int main(){int x[MAXNUM];int n = 0;double t1, t2;FILE *fp;fp = fopen("numbers.txt", "r");if (fp == NULL){printf("打开文件错!请下载文件,并将之复制到与源程序文件同一文件夹下。\n");exit(1);}while (fscanf(fp, "%d", &x[n]) != EOF)n++;printf("数据量:%d, 开始排序....", n);t1 = time(0);selectsort(x, n);t2 = time(0);printf("用时 %d 秒!", (int)(t2 - t1));fclose(fp);return 0;}
运行结果:
//第二种算法#include <stdio.h>#include <time.h>#include <stdlib.h>#define MAXNUM 100000void quicksort(int data[], int first, int last){int i, j, t, base;if (first>last)return;base = data[first];i = first;j = last;while (i != j){while (data[j] >= base && i<j)j--;while (data[i] <= base && i<j)i++;/*交换两个数*/if (i<j){t = data[i];data[i] = data[j];data[j] = t;}}data[first] = data[i];data[i] = base;quicksort(data, first, i - 1);quicksort(data, i + 1, last);}int main(){int x[MAXNUM];int n = 0;double t1, t2;FILE *fp;fp = fopen("numbers.txt", "r");if (fp == NULL){printf("打开文件错!请下载文件,并将之复制到与源程序文件同一文件夹下。\n");exit(1);}while (fscanf(fp, "%d", &x[n]) != EOF)n++;printf("数据量:%d, 开始排序....", n);t1 = time(0);quicksort(x, 0, n - 1);t2 = time(0);printf("用时 %d 秒!", (int)(t2 - t1));fclose(fp);system("pause");return 0;}
(2)汉诺塔
有一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。
可以算法出,当盘子数为
用递归算法求解汉诺塔问题,其复杂度可以求得为
#include <stdio.h>#include <windows.h>#define discCount 4long move(int, char, char, char);int main(){long count;count = move(discCount, 'A', 'B', 'C');printf("%d个盘子需要移动%ld次\n", discCount, count);system("pause");return 0;}long move(int n, char A, char B, char C){long c1, c2;if (n == 1)return 1;else{c1 = move(n - 1, A, C, B);c2 = move(n - 1, B, A, C);return c1 + c2 + 1;}}
运行结果:
知识点总结:在第一个项目中,运用不同的算法求解相同的问题,可以看出两种方法的效率差距是很大的。第二个项目中可以看出随着要移动盘子的增多需要移动的次数呈指数型增长。
学习心得:所以,以后在开发设计算法的时候要考虑好时间复杂度与空间复杂度,设计简洁高效
- 第二周项目3
- 第二周项目3
- 【第二周】项目3
- 第二周 项目3
- 第二周项目3
- 第二周-项目3
- 第二周项目3
- 第二周项目3 两数做差
- 第二周 项目3-1
- 第二周项目3-汉诺塔
- 第二周-项目3-汉诺塔
- 第二周项目3--汉诺塔
- 第二周项目3-时间类
- 第二周项目3—时间类
- 第二周项目3-时间类
- 第二周项目3-长方柱类
- 第二周项目3时间类
- 第二周上机项目3 时间类
- 【动态规划】动态规划解题的一般思路——以数字三角形为例
- 线性表合并
- iOS 隐藏导航栏最佳实践
- 机器学习深入与强化--数学基础(3)
- 利用Java输出菱形
- 第二周-项目3
- linux环境下nginx_http服务器的配置
- idea最快上传maven项目
- Spring框架_3.5_运行时值注入
- markdown学习过程
- 107. Binary Tree Level Order Traversal II
- 使用JavaScript判断手机的横竖屏
- Centos7 自动化工具 Ansible 安装配置
- 顺序表