时间复杂度

各个排序算法的时间复杂度和稳定性总结

佐手、 提交于 2019-12-06 06:46:50
排序图表: 一、插入排序   每次将一个待排序的数据,跟前面已经有序的序列的数字一一比较找到自己合适的位置,插入到序列中,直到全部数据插入完成。 二、希尔排序   先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。由于希尔排序是对相隔若干距离的数据进行直接插入排序,因此可以形象的称希尔排序为“跳着插” 三、冒泡排序 通过交换使相邻的两个数变成小数在前大数在后,这样每次遍历后,最大的数就“沉”到最后面了。重复N次即可以使数组有序。 冒泡排序改进1:在某次遍历中如果没有数据交换,说明整个数组已经有序。因此通过设置标志位来记录此次遍历有无数据交换就可以判断是否要继续循环。 冒泡排序改进2:记录某次遍历时最后发生数据交换的位置,这个位置之后的数据显然已经有序了。因此通过记录最后发生数据交换的位置就可以确定下次循环的范围了。 四、快速排序 “挖坑填数+分治法”,首先令i =L; j = R; 将a[i]挖出形成第一个坑,称a[i]为基准数。然后j--由后向前找比基准数小的数,找到后挖出此数填入前一个坑a[i]中,再i++由前向后找比基准数大的数,找到后也挖出此数填到前一个坑a[j]中。重复进行这种“挖坑填数”直到i==j。再将基准数填入a[i

3. 快速排序

坚强是说给别人听的谎言 提交于 2019-12-06 04:24:02
  快速排序( Quick Sort )与冒泡排序均为 交换类排序 。快排是对冒泡排序的一种改进。由于 关键字的比较和交换是跳跃进行 的,因此,快速排序是一种 不稳定 的排序方法。 0. 序 1. 冒泡排序 2. 快速排序 2.1 基本思想 2.2 一趟快速排序(一趟划分) 2.3 过程 2.4 实现 2.5 复杂度分析 2.5.1 时间复杂度(包含证明) 2.5.2 空间复杂度 0. 序   快速排序算法最早由图灵奖获得者 Tony Hoare 设计出来的,他在形式化方法理论以及 ALGOL60 编程语言的发明中都有卓越的贡献,是上世纪最伟大的计算机科学家之一。   快速排序被列为 20 世纪十大算法之一。   1. 冒泡排序   假设在排序过程中,记录序列 R[1...n] 的状态为:   更多的冒泡排序讲解见 https://www.cnblogs.com/datamining-bio/p/9715774.html   2. 快速排序   快速排序也是通过不断比较和移动交换来实现排序的,只不过它的实现,增大了记录的比较和移动的距离,将 关键字较大的记录从前面直接移动到后面,关键字较小的记录从后面直接移动到前面,从而减少了总的比较次数和移动交换次数 。   2.1 基本思想   通过一趟排序将待排记录 分割成独立的两部分 ,其中一部分记录的关键字均比另一部分记录的关键字小

运用python实现冒泡排序算法

依然范特西╮ 提交于 2019-12-06 03:22:57
冒泡排序,一个经典的排序算法,因在算法运行中,极值会像水底的气泡一样逐渐冒出来,因此而得名。 冒泡排序的过程是比较两个相邻元素的大小,然后根据大小交换位置,这样从列表左端开始冒泡,最后最大值会依次从右端冒出。 python实现冒泡排序: def bubble_sort(nums): for i in range(len(nums) - 1): for j in range(len(nums) - i - 1): if nums[j] > nums[j + 1]: nums[j], nums[j + 1] = nums[j + 1], nums[j] return nums python实现冒泡排序的核心思想是通过从列表一端迭代循环元素,再通过一个循环让这个元素之后的元素相邻两个比较,从而依次将最大值移动到最末端,如下图示意。 本想放gif图的,放不上有点问题。 关于冒泡排序的时间复杂度,在上面python实现的代码中时间复杂度是 n的平方 ,当然可以再考虑一下极端的情况:当队列已经从小到大排好序或者从大到小排好序,从小到大排好顺序时可以只扫描一遍就结束排序,此时时间复杂度为O(n),如果是从大到小,那么就需要扫描n-1次,同时需要比较交换n-1次,时间复杂度为n的平方 。 来源: https://www.cnblogs.com/pypypy/p/11960134.html

数据结构

廉价感情. 提交于 2019-12-06 01:52:08
什么是B+树? 历史: 1:全部遍历 2:hash 3 :二叉树 4 :平衡二叉树(avl) 5 :B树 6:b+树 加速查找速度的数据结构: (1)哈希:例如hashMap,查询/修改/插入/删除的平均时间复杂度是O(1); (2)树:例如平衡二叉树,查询/修改/插入/删除的平均时间复杂度是O(log2(n)); 来源: https://www.cnblogs.com/leeego-123/p/11955662.html

数据结构 期末复习 —— 算法复杂度分析

冷暖自知 提交于 2019-12-06 01:43:27
算法复杂度分析 判断题 算法分析的两个主要方面是时间复杂度和空间复杂度的分析。 T \(N^2logN\) 和 \(NlogN^2\) 具有相同的增长速度。 F 解析:前者是次立方阶,后者是次平方阶。 \(2^N\) 和 \(N^N\) 具有相同的增长速度。F 解析:指数阶的增长速度小于阶乘小于 \(N^N\) \((NlogN)/1000\) 是 \(O(N)\) 的。 F 在任何情况下,时间复杂度为 \(O(n^​2)\) 的算法比时间复杂度为 \(O(n*logn)\) 的算法所花费的时间都长。 F 对于某些算法,随着问题规模的扩大,所花的时间不一定单调增加。 T 单选题 函数题 知识点详解 来源: https://www.cnblogs.com/LYT-Dveloper/p/11955527.html

数据结构基本概念

三世轮回 提交于 2019-12-06 01:39:33
数据结构基本概念 1 数据:数据是用来描述现实世界的数字、字符、图像、声音,以及能够输入到计算机中并能被计算机处理的符号集合 2 数据元素: 数据元素是数据的基本单位 ,在计算机中通常作为一个整体进行考虑和处理,通常也称为“元素”、“记录”、“节点”等 3 数据对象:数据对象是具有相同性质的数据元素的集合,是数据的一个子集 4 数据结构:在实际问题中,数据元素不是孤立存在的,而是在相互之间存在一种或多种特定的关系,这种数据元素相互间的关系称为“数据结构“ 注:我觉得应该重点理解”数据元素“和”数据结构“ 数据元素举例:在学生信息表中,可能含有姓名、学号、性别等字段(属性),每个学生的信息可以称为一条记录,也就是一个数据元素,并且一般作为整体处理 数据结构:包含数据逻辑结构和数据存储结构两方面的描述 一、数据的逻辑结构 1 集合结构 : 集合结构的数据元素除了同属于一个集合外,他们之间没有任何联系. 2 线性结构 : 数据元素存在”一对一”的关系 3 树形结构 : 数据元素存在”一对多”的关系 4 图形结构 : 数据元素存在”多对多”的关系 二、数据的存储结构 数据的存储结构就是数据元素及其相互关系的存储方式。要想用计算机处理数据,就必须把数据的逻辑结构映射为数据的存储结构。 按照数据的存储结构,一般将数据结构分为顺序存储结构、链式存储结构、索引存储结构和散列存储结构。 1

时间复杂度与空间复杂度

╄→尐↘猪︶ㄣ 提交于 2019-12-06 01:04:16
1.算法效率: 对于一个程序而言,我们通常关注两个点,第一点是运行的快慢,即单位时间能做多少事,第二点是消耗多少内存空间。我们编写程序就关注决定这两点的算法效率。 算法效率分析分为两种:时间效率和空间效率。时间效率被称为时间复杂度,而空间效率 被称作空间复杂度。 时间复杂度主要衡量的是一个算法的运行速度,而空间复杂度主要衡量一个算法所需要 的额外空间。 2.时间复杂度: 时间复杂度知识结构: 时间复杂度的定义:算法的时间复杂度是一个函数,定量描述算法的运行时间。一算法执行所耗费的时间,只有把程序运行起来才能知道。但是我们每个算法都上机测试很麻烦,而且有些时候想要在设计阶段控制时间复杂度,需要预测时间复杂度。所以才有了时间复杂度这个 分析方式。一个算法所花费的时间与其中语句的执行次数成正比例,算法中的基本操作的执行次数,为算法 的时间复杂度。 实际中我们计算时间复杂度时,我们其实并不一定要计算精确的执行次数,而只需要大概执行次数,使用大O的渐进表示法。 大O符号(Big O notation):是用于描述函数渐进行为的数学符号。 推导大O阶方法: 1、用常数1取代运行时间中的所有加法常数。 2、在修改后的运行次数函数中,只保留最高阶项。 3、如果最高阶项存在且不是1,则去除与这个项目相乘的常数。得到的结果就是大O阶。 大O的渐进表示法去掉了那些对结果影响不大的项

几种常见排序方法的基本介绍,性能分析,和c语言实现

不羁的心 提交于 2019-12-06 00:50:17
本文介绍8种常见的排序算法,以及他们的原理,性能分析和c语言实现: 为了能够条理清楚, 本文所有的算法和解释全部按照升序排序进行 首先准备一个元素无序的数组arr[],数组的长度为length,一个交换函数swap, 在main函数中实现排序函数的调用,并输出排序结果: void swap(int*x , int*y) { int temp = *x; *x = *y; *y = temp; } int main() { int arr[] = { 1,8,5,7,4,6,2,3}; int length = sizeof(arr) / sizeof(int); sort(arr, length); for (int i = 0;i < length;i++) { printf("%d\n", arr[i]); } return 0; } 插入排序 第一次循环: 第二次循环: 第三次循环: 外层循环每执行一次就从无序区向有序区中插入一个数据arr[i]   里层循环控制插入的数据arr[i]与其前一个数据比较,如果比前一个数据小,就让前一个数据后移1位   ...不断重复上述步骤,直到找到不比arr[i]小的数据arr[j],因为arr[j]后面的数据都后移了1位,所以直接将arr[i]放在空闲的arr[j+1]位置 c程序实现: void CRsort(int arr[],

[DS+Algo] 001 先简单说说算法

做~自己de王妃 提交于 2019-12-06 00:46:01
目录 1. 通俗地讲 2. 算法的五大特性 3. 众所周知的“公式” 4. 举个例子 例 1. 百钱买百鸡 1. 数学解法 2. C 的解法 3. Python 的解法 4. Java 解法 5. 小结 5. 算法衡量 5.1 有这样两个指标 5.2 大 O 记法 5.3 时间复杂度及其他 5.3.1 定义 5.3.2 此外,还有 5.3.3 时间复杂度计量规则 5.3.4 判断一个算法的效率 5.3.5 其他 6. 举例分析 1. 通俗地讲 算法是解决计算问题的方法 2. 算法的五大特性 输入总数 >= 0 输出数量 >= 1 有穷性 确定性 可行性 3. 众所周知的“公式” 程序 = 数据结构 + 算法 4. 举个例子 例 1. 百钱买百鸡 公鸡,五钱一只;母鸡,三钱一只;小鸡,一钱三只。 一百钱买一百只鸡,如何买? 1. 数学解法 解:设购买公鸡 x 只,母鸡 y 只,小鸡 z 只 \[ \left\{ \begin{aligned} x + y + z = 100 \\ 5x + 3y + \frac z3 = 100 \end{aligned} \right. \] 2. C 的解法 #include <stdio.h> void buy_chicken(); int main() { buy_chicken(); return 0; } void buy_chicken

一套图 搞懂“时间复杂度”

家住魔仙堡 提交于 2019-12-05 15:32:35
写在前面: 这篇文章是在公众号: 程序员小灰 中发布的。是我到目前为止所看到的关于时间复杂度介绍的最好的文章,简介 清晰 明了。 所以拿来po出来 仅供学习交流,如侵则删。 现已将此文收录至: 《数据结构》C语言版 (清华严蔚敏考研版) 全书知识梳理 正文: 时间复杂度的意义 究竟什么是时间复杂度呢?让我们来想象一个场景:某一天,小灰和大黄同时加入了一个公司...... 一天过后,小灰和大黄各自交付了代码,两端代码实现的功能都差不多。大黄的代码运行一次要花100毫秒,内存占用5MB。小灰的代码运行一次要花100秒,内存占用500MB。于是...... 由此可见,衡量代码的好坏,包括两个非常重要的指标: 1.运行时间; 2.占用空间。 基本操作执行次数 关于代码的基本操作执行次数,我们用四个生活中的场景,来做一下比喻: 场景1:给小灰一条长10寸的面包,小灰每3天吃掉1寸,那么吃掉整个面包需要几天? 答案自然是 3 X 10 = 30天。 如果面包的长度是 N 寸呢? 此时吃掉整个面包,需要 3 X n = 3n 天。 如果用一个函数来表达这个相对时间,可以记作 T(n) = 3n。 场景2:给小灰一条长16寸的面包,小灰每5天吃掉面包剩余长度的一半,第一次吃掉8寸,第二次吃掉4寸,第三次吃掉2寸......那么小灰把面包吃得只剩下1寸,需要多少天呢? 这个问题翻译一下