数据结构的算法

数据结构的算法

一、算法

数据结构中的算法指的是数据结构所具备的功能。
1、分治
把一个大而复杂的问题,分解成好多个小而简单的问题,然后利用计算机强大的计算能力来解决。实现分治的方法有递归,循环。
2、递归
是函数自己调用自己的行为,可以形成循环调用,进而实现分治的算法。

在什么情况下可以使用递归:
1、问题过于复杂而无法拆解成循环语句。
2、问题非线性,而函数递归,需要借助栈内存,函数的每一次调用,它的数据都会重新压入栈空间,可以解决非线性的问题(例如二叉树的遍历,汉诺塔问题等)

注意:在单线程模式下只能同时执行一个函数,当函数调用自己(子级)时,会执行子级的代码,子级执行完后再返回上一级继续执行,一直到跳出循环。

如何安全实现递归:
由于递归的特点,所以容易形成“死循环”,非常浪费资源。
所以使用过程中,我们要:
1、先写出口,考虑如何调用无限的调用停止 if(条件) return
2、解决一个小问题
3、把剩下的问题交给下一级
递归的优点:代码简单,容易理解
递归的缺点:容易形成死循环,浪费空间,执行效率低(参数的入栈,出栈,局部变量的定义,销毁)

二、查找

1、顺序查找
从头到尾逐一比较,对于查找的数据没有要求,但方法简单,在小规模的数据查找中比较常用,效率低。
2、二分查找
前提是数据必须有序,然后从中间位置开始找,比他小的从左边,比他大的从右边。
3、块查找
权重查找适用于特殊条件下,需要对数据进行排序,分析总结,归纳。

三、排序

1、冒泡排序
是一种稳定排序,在排序过程中可以检测到数据是否已经有序,可以立即停止,如果待排序数据基本有序(对数据有序性敏感),效率非常高。
2、选择排序
冒泡排序的一种变种,但是他没有冒泡对数据有序性敏感,但它在排序过程中,比冒泡要少很多数据交换,所以要比冒泡快(数据比较混乱的情况下)。
3、插入排序
当一小列数据数据已经有序,再有新数据加入时,适合使用插入排序
4、快速排序
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
例
    83 86 77 15 21 35 86 92 49 [93]
	83 86 77 15 21 35 86 92 49 93 
	15 [21] 77 86 83 35 86 92 49 
	15 21 77 86 83 35 86 92 49 93 
	77 86 83 [35] 86 92 49 
	15 21 35 86 83 77 86 92 49 93 
	86 83 [77] 86 92 49 
	15 21 35 49 77 86 86 92 83 93 
	86 [86] 92 83 
	15 21 35 49 77 86 83 86 92 93 
	[86] 83 
	15 21 35 49 77 83 86 86 92 93
5、堆排序
首先把数据当成完全二叉树,保证根结点最大,然后让结点与最后一个元素交换,然后再调整二叉树(逐渐减小数组),重复上述操作,让根依旧保持最大。
6、归并排序
不需要交换数据,但需要额外的空间,用作临时的存储空间。

排序算法的稳定性:当序列中有相同的数据量时,算法会不会改变这两个数的位置(改变了就我不稳定,不改变则稳定)。

时间复杂度:指的是次数,不是所花的时间。
最好 最坏
冒泡:O(n) O(n^2)
插入:O(n) O(n^2)
选择:O(n) O(n^2)
堆: O(nlog2n) O(nlog2n)
快速:O(nlog2n) O(n^2)
归并:O(nlog2n)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值