首页 > 编程语言 >算法分析与设计

算法分析与设计

时间:2024-09-11 20:50:56浏览次数:3  
标签:分析 int 算法 didswitch numpairs 设计 排序 比较 逆序

渐进上界:得到一个问题规模充分大时一个算法的时间复杂度f (n)的上界O(n)
相同定义\Omega (n) 渐进下界
渐进精确界:既是渐进上界,又是渐进下界

最优算法:算法A所在的算法类中的其他算法,在最坏(或平均)情况下,执行基本操作的次数不比A更少。

第一章:排序问题

排序:n个数据元素按照key递增或者递减排序

n个元素的序列有n!种不同排列,每种排列用”Π“标记

一、直接插入排列

特点:每次比较后发生一次移动或者不发生移动

额外空间:o(1)
时间:
        1.最好情况:待排序序列已经有序,需要n-1次比较,0次移动
        2.最坏情况:待排序序列逆序,需要1+2+3+...+(n-1)次比较,1+2+3+...+(n-1)次移动。
        3.平均情况A(n):求解所有情况的时间不现实,所以选则求解插入第i个元素时的平均比较次数,再求和

对直接插入排序的分析:直接插入排序每次比较操作最多移动一次数据,每次比较最多消灭一个逆序对,直接插入排序中有多少逆序对就要至少比较几次

最坏情况:待排序序列完全逆序,1+2+3+...+(n-1)个逆序对,则其时间复杂度最少为o(n^{_{}^{2}}),且无法改进。

平均情况:技巧:两个相反情况的逆序共有1+2+3+...+(n-1)个,每个占一半为平均情况

note:这两种情况均无法再进行改进。

二、冒泡排序

将待排序的按照元素的key顺序两两比较,若逆序则交换,将最大的key元素换到了当前待排序序列的最后,若某趟冒泡没发生元素交换,那么排序结束

特点:最多需要n-1次冒泡,每次比较最多消灭一个逆序对

void bubblesort(Element E[], int n)
{
	int numpairs;
	int didswitch;
	int j;
	numpairs = n-1;//numpairs 记录当前趟比较的次数 
	didswitch = 1;
	while(didswitch)//didswitch 记录当前趟冒泡是否交换过数据,没交换过则结束循环 
	{
		didswitch = 0;//将didswitch置零 
		for(j = 0; j<numpairs; j++)
		{
			if(E[j]>E[j+1])
			{
				E[j]<->E[j+1];
				didswitch = 1;
			}
		}
		numpairs--;//每趟使得需要比较的数-1 
	}
	
 } 

证明冒泡排序的正确性:(数学归纳法)

时间复杂度:
B(n):最好情况:待排序序列已经有序,n-1次比较,0次移动 复杂度大小O(n)
W(n):最坏情况:待排序序列逆序,1+2+3+...+(n-1)次比较,1+2+3+...+(n-1)次移动
A(n):假设每种情况出现的概率是相同的,可证
改进方法:每趟冒泡排序都跟踪第一次,最后一次交换的位置

void bubblesort(Element E[], int n)
{
	int numpairs;
	int firstchange,lastchange;//每趟冒泡排序第一次 ,最后一次发生交换的位置 
	int didswitch;
	int j;
	numpairs = n-1;//numpairs 记录当前趟比较的次数 
	didswitch = 1;
	firstchange = 1; 
	while(didswitch)//didswitch 记录当前趟冒泡是否交换过数据,没交换过则结束循环 
	{
		didswitch = 0;//将didswitch置零 
		for(j = firstchange - 1; j<lastchange; j++)
		{
			if(E[j]>E[j+1])
			{
				E[j]<->E[j+1];
				if(!didswitch)
				{
					firstchange = j;//记录第一次交换时的位置 
				}
				didswitch = 1;
				numspairs = j;
			}
		}
		lastchange = numpairs;
		if(firstchange<1) firstchange = 1;
	}
//通过及记录第一次交换时的位置,当前面排好序的时候,可以减少时间
	
 } 

三、分治策略

大规模问题分解为多个规模较小的问题——解决并合并为原问题的解
流程:划分->解决->合并


标签:分析,int,算法,didswitch,numpairs,设计,排序,比较,逆序
From: https://blog.csdn.net/wjm041006/article/details/142147205

相关文章

  • 学习《领域驱动设计-软件核心复杂性应对之道》的过程随笔
    本随笔谨用于记录本人学习《领域驱动设计-软件核心复杂性应对之道》的过程和收获,愿与大家共享之初写于2024.07.24,学习未竟,随笔伴行-- 本人于工作期间阅读该书,发现很多值得反复学习的方法和思考方式,随笔记录;兴之所至,兴尽即止---本文是针对面向对象开发人员所编写的,如不合适,请......
  • TensorFlow深度学习框架改进K-means、SOM自组织映射聚类算法及上海招生政策影响分析研
    全文链接:https://tecdat.cn/?p=37652 原文出处:拓端数据部落公众号 分析师:ChenZhang 在教育政策研究领域,准确评估政策对不同区域和学生群体的影响至关重要。2021年上海市出台的《上海市初中学业水平考试实施办法》对招生政策进行了调整,其中名额分配综合评价模块的变化尤为......
  • 十大排序算法的特点及应用场景
    一.十大经典排序算法介绍1.冒泡排序(BubbleSort)原理:通过重复遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复进行的,直到没有再需要交换的元素为止。特点:简单但效率低,适合小数据量的排序。2.选择排序(SelectionSort)原理:首......
  • 基于数据可视化大屏+SpringBoot的校园篮球信息与购物平台设计和实现(源码+论文+部署讲
    博主介绍:✌全网粉丝50W+,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、P......
  • 数据处理与统计分析篇-day01-Linux基础与环境搭建
    day01-Linux基础计算机简介概述电子计算机,电脑,PC,Computer,就是由软件+硬件组成的电子设备.组成计算机硬件CPU(运算器,控制器)存储器(内存,外存)输入设备输出设备计算机软件系统软件:充当用户和计算机硬件之间的桥梁的.PC端:windows,......
  • fps游戏刷怪系统代码逻辑架构设计
    FPS游戏的刷怪系统主要负责生成怪物并在合适的时机和位置将它们放入游戏世界。在设计刷怪系统时,我们需要考虑以下几个方面:刷怪点:在游戏地图上设置一些预定的刷怪点,这些点用于生成怪物。可以将刷怪点存储在一个容器中,供刷怪系统使用。刷怪波次:将怪物刷怪划分为多个波次,每......
  • LeetCode算法—滑动窗口
    一:滑动窗口1、窗口:滑动窗口的核心就是一个窗口;通常使用两个指针表示(一个指向左边界;一个指向右边界);窗口中的元素就是当前字串2、滑动:窗口从数组或字符串的起始位置开始,逐步向右滑动。当窗口无法满足条件时,调整左边界以缩小窗口;当窗口满足条件时,尝试记录当前窗口的结果,并继续调整......
  • java计算机毕业设计民宿出租管理系统(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景:随着旅游业的蓬勃发展和人们对个性化旅行体验的追求,民宿作为一种新兴的住宿方式,在全球范围内迅速崛起。它以其独特的文化氛围、灵活的租赁方式及亲民......
  • 校园安全Ai视频分析预警方案 CNN
    校园安全AI视频分析预警系统基于先进的人工智能技术,校园安全Ai视频分析预警系统通过对校园摄像头监控视频的实时分析和识别,对学生的行为进行智能监测和预警。系统可以识别学生打架斗殴、抽烟、翻墙、倒地以及异常聚集等行为,及时发出预警通知,帮助学校管理者快速做出反应。系统能......
  • 基于python+flask框架的新冠疫情志愿者管理系统设计与实现(开题+程序+论文) 计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景自新冠疫情爆发以来,全球范围内对公共卫生应急响应的需求急剧增加,志愿者作为社会力量的重要组成部分,在疫情防控中发挥了不可替代的作用。从......