常用算法的递归实现问题分析(针对《数据结构与程序设计》by Robert.L.Kruse)
来源:互联网 发布:逃回北上广 知乎 编辑:程序博客网 时间:2024/06/07 09:53
常用算法的递归实现问题分析
——针对《数据结构与程序设计》by Robert.L.Kruse
直接或者间接调用自身的算法称为递归算法。在程序设计中,递归实现是一种结构清晰,可读
性强的方法。它经常和分治法结合使用,即对于一个复杂的问题,我们可以考虑先将其反复的
分解成相似的子问题,直到子问题规模小到可以轻易解决。注意,子问题的问题规模必须比原
问题小且简单。 将求出的小规模问题的解合并为一个更大规模问题的解,自底向上逐步求出原
来问题的解。
在对问题进行递归分解之前,必须确定该递归过程的终止条件;必须明确递归分解步骤的精确
形式。
一,快速排序
基本思想(连续存储):首先,一般选择位于数组中部的元素作为枢轴。然后将该数组分成两部
分(两个子数组),位于枢轴前面的元素都比枢轴元素小,以后的都比枢轴元素大。其后反复做
同样的递归分解,直到满足终止条件:high<=low.(low,high分别表示子数组头元素和尾元
素的序号)最后将所有子数组自底向上合并,即得到一个有序数组。
算法复杂度分析:
(面试时注意这里经常被问到)
首先快速排序的平均时间复杂度是O(nlogn),最坏情况下(每次被分成1,n-1)两部分,时间复杂度是
O(n^2).这里主要考察交换swap次数。
假设p(排号)被选作哨兵,则partition后,数列被划分了1,...,p-1和p+1,...,n两部分
s(n,p)=(p+1)+s(p-1)+s(n-p)
s(n,1)+s(n,2)+....+s(n,n)=(1+1)+s(1-1)+s(n-1)+(2+1)+s(2-1)+s(n-2)+...(n+1)+s(n-1)+s(0)
[s(n,1)+s(n,2)+...+s(n,n)]/n=s(n)=n/2+3/2+2/n(s(0)+s(1)+...+s(n-1))
s(n-1)=(n-1)/2+3/2+2/(n-1)(s(0)+s(1)+...+s(n-2))
ns(n)-(n-1)s(n-1)=n+1+2s(n-1) =>s(n)/(n+1)=s(2)/3+1/3+...+1/n
1+1/2+...+1/n=ln n+O(1) => s(n)=(n+1)ln n +O(n)
二,归并排序
基本思想(链表存储):首先,尽量将链表分为元素数相等的两个子串,然后分别对其排序,递
归分解直到满足终止条件:sub_list=NULL&&sub_list->next=NULL。最后再将两个已排序
的子串合并为一个链表。
<未完待续>
- 常用算法的递归实现问题分析(针对《数据结构与程序设计》by Robert.L.Kruse)
- 查找算法 —— 来自《C++数据结构与程序设计》Robert L.Kruse Alexander J.Ryba
- 数据结构与程序设计——C++语言描述(Data Structures & Program Design in C++) by Robert L.Kruse & Alexander J.Ryba
- 数据结构与程序设计——C++语言描述(Data Structures & Program Design in C++) by Robert L.Kruse & Alexander J.Ryba
- 数据结构与程序设计——C++语言描述(Data Structures & Program Design in C++) by Robert L.Kruse & Alexander J.Ryba
- 数据结构与程序设计——C++语言描述(Data Structures & Program Design in C++) by Robert L.Kruse & Alexander J.Ryba
- 数据结构与程序设计——C++语言描述(Data Structures & Program Design in C++) by Robert L.Kruse & Alexander J.Ryba
- 数据结构与程序设计——C++语言描述(Data Structures & Program Design in C++) by Robert L.Kruse & Alexander J.Ryb
- 实用算法的分析与程序设计——递归法(实例,代码)(划分问题、0-1背包问题)
- Java数据结构与算法分析《七》递归的高级应用
- 数据结构与算法分析-队列的实现
- 数据结构与算法分析-栈的实现
- (c#)数据结构与算法分析 --递归
- 数据结构与算法分析笔记:第一章:递归
- java数据结构与算法分析之递归
- Java数据结构与算法分析《六》递归
- 整数划分问题算法分析与实现(递归)
- 棋盘覆盖问题算法分析与实现(递归)
- #pragma预处理指令略解
- java知识点汇总之四容器
- 3.9如何设置一个视图的初始位置和大小?
- java
- 敏捷开发:SCRUM软件开发模型
- 常用算法的递归实现问题分析(针对《数据结构与程序设计》by Robert.L.Kruse)
- CSDN广州地区2010.05.30腐败会策划进行时,同时欢迎来自哈尔滨的yizia大版主
- 软件质量控制新思路
- #pragma pack(1) and #pragma pack(push,1)是什么意思
- 传智播客JAVA培训 2010522
- shell是一种程序
- VC TRACE宏
- 亲们~~大家好~~这里是我们天外信管计算机相关技术分享基地~~~
- SQL语句