数据结构与算法(一)

本文介绍了多种分类和搜索算法。分类算法包括冒泡排序、选择性排序、插入排序、堆排序、并归排序和快速排序,分析了各算法的原理和时间复杂度;搜索算法涵盖列表搜索(线性搜索、二分搜索)和图标搜索(广度优先搜索),阐述了不同搜索场景下的适用算法。

前言

最近也没时间刷题。很揪心

分类算法

冒泡排序

  1. 每次进行两两相比并交换位置,一次外循环能排好一个位置。
  2. 时间复杂度 O(n^2)

选择性排序

  1. 一次线性搜索找到最小值,放到最前面
  2. 时间复杂度O(n^2)

其实和冒泡排序没什么差。

插入排序

  1. 将左端设做已经排序完毕,然后从未排序的右端依次比较左端的数,直到找到一个比它小的数,然后把它放到这个数的后面,或者直接到最左端。
  2. 事件复杂度O(n^2)

还是两个循环嘛。

堆排序

  1. 这个主要是利用了堆的数据结构。堆的数据结构的效果就是“任意顺序添加数据,然后能顺序取出数据”。(堆不能取出中间的某一个元素。这么想一想的话,限制条件少了一个的话,或许就能从现有的方法中找出更高效的方法。)
  2. 堆,实现优先队列的方式。定义规定,子类数字总是大于其父类。这样取出树的根节点就必然是最小的。怎么实现呢?把一个数放进堆中,先放到最后的叶子节点中,然后比较父类,如果它比较小,就和父类交换,一直到最顶端。
  3. 思想,我觉得这中间体现了:一个数存两个信息的思想。因为父节点必然是父节点另外的子节点中最小的,所以和父节点比较就行了。因此相应取数据的时候,也总是要比较两边的数据,其中最小的再放到根节点。
  4. 时间复杂度:?放入堆中的这个过程的时间复杂度应该怎么计算呢?

并归排序

  1. 分组,每次分出一半,直到每组只有一个;然后进行合并;只有一个数的时候合并很简单,比较大小,当每组有多个数的时候,依次比较每组的开头数,小的放入;
  2. 牺牲空间换取时间- -。

快速排序

  1. 为了找到每个数合适的位置,选中标准数后,左标记放在最左边然后向右移动 找到比标记位大的数。右标记找到比比标记小的数 然后交换 继续移动直到相遇。
  2. 其过程其实是快速找到标准位应该在的位置。让形如xxxAxxx样式的一串数字,A的数值一定比左边的大,比右边的小。不再是冒泡,选择排序那样,每次固定最小值应该在的位置然后找最小值,而是找到任意一个数应该在的位置。
  3. 所以如果先移动左边的游标,如果撞到右边的游标了,这个时候其实右边游标还没有排序,(不过其实右边游标上一次有完成过排序的),然后一直撞到标记数,这就说明标记数在的地方是正确的地方了。相反右边的游标如果撞到左边的,因为左边已经完成排序了,都是比标记数小的了,它就没必要再去看了,直接在这个位置和标记数交换。
  4. 每次完成一次排序之后,分别从它的左右两边排序,这样就避免重复看已经排好的数
  5. 时间复杂度:O(nlog2n)为什么呢?

搜索算法

列表搜索

线性搜索

未排序的数据,一个个找

二分搜索

已经排好序了,当然不用线性搜索了!,如果不能直接引用的话(比如 1 5 9 11 28 中间找9),就从中间分两半,然后让这个中间数和目标数比较。重复进行。

图标搜索

广度优先搜索

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值