- UID
- 10611
- 斋米
-
- 斋豆
-
- 回帖
- 0
- 积分
- 889
- 在线时间
- 小时
- 注册时间
- 2011-4-8
- 最后登录
- 1970-1-1
|
5 E& u/ U, [' b) B( j0 x
大话数据结构% q2 I7 `8 B0 ^7 G
作 者:程杰 著$ o: {3 `( |5 A& P6 b( ~8 T z
出 版 社:清华大学出版社/ Q0 v3 o5 i# s$ ~
ISBN:9787302255659
% O2 h4 n! Z. \- G4 t- d9 U; Z. T出版时间:2011-06-01: P* ^8 f, s# n! p6 Y7 {4 i
版 次:1
) {8 D1 w" ]5 W1 S. N页 数:468. Y. ]8 z5 `+ k e J" p& z
装 帧:平装+ k0 ^2 T. L, J% [% Y
开 本:16开$ O! x+ E E8 M- `6 ~
所属分类:图书 > 计算机与互联网 > 编程语言与程序设计9 ?& G1 `5 C N& Y
商品编号:10663703
5 E8 ]( k4 e1 \( o印刷时间:2011-06-01* H7 s! M! S1 o
; q. |7 N6 Z2 V" ~9 j' i& I `% \
大话数据结构" i: t( ]; V# W, f( X
4 W$ g3 U* Z. ~1 P) g
《大话数据结构》为超级畅销书《大话设计模式》作者程杰潜心三年推出的扛鼎之作!以一个计算机教师教学为场景,讲解数据结构和相关算法的知识。通篇以一种趣味方式来叙述,大量引用了各种各样的生活知识来类比,并充分运用图形语言来体现抽象内容,对数据结构所涉及到的一些经典算法做到逐行分析、多算法比较。与市场上的同类数据结构图书相比,本书内容趣味易读,算法讲解细致深刻,是一本非常适合自学的读物。2 i# N; y) X4 C$ Z- g
·《我在哈佛学到的人脉课》顶级猎头成长笔记,全国独家! >>·《后宫·如懿传》后宫女人的生存史诗,热卖中! >>( S9 N5 D! G* t
内容简介
# e2 d8 {, I/ R8 ~3 u# o2 e 《大话数据结构》为超级畅销书《大话设计模式》作者程杰潜心三年推出的扛鼎之作!以一个计算机教师教学为场景,讲解数据结构和相关算法的知识。通篇以一种趣味方式来叙述,大量引用了各种各样的生活知识来类比,并充分运用图形语言来体现抽象内容,对数据结构所涉及到的一些经典算法做到逐行分析、多算法比较。与市场上的同类数据结构图书相比,本书内容趣味易读,算法讲解细致深刻,是一本非常适合自学的读物。0 U7 G _/ I! o) v- `
目录
9 n1 c5 i; y* |9 D! |- c第1章 数据结构绪论8 @" j3 t+ m% M3 c* c. Q& ?
1.1 开场白 W; }. Y, @! A/ L2 k. Q4 Q
1.2 你数据结构怎么学的? ~, @0 L0 |9 Z4 K1 J
1.3 数据结构起源* Q; W. [! D2 X
1.4 基本概念和术语
0 e! s" z$ g8 _8 c3 a1.4.1 数据' n: j1 n0 p6 o0 ?7 G. j- i
1.4.2 数据元素
. n7 k- W" u' _1.4.3 数据项
# M# m( |3 p0 [, B, j6 {1.4.4 数据对象
' G' \, m" {3 X g* s( O1.4.5 数据结构
% q$ L+ M$ C# s1.5 逻辑结构与物理结构0 V+ Z* m1 P2 o$ W' W
1.5.1 逻辑结构, S) _0 \! s) I9 Y" @; R! K/ D
1.5.2 物理结构
- [' ]" E! C( ]" Y. M1.6 抽象数据类型+ } D2 o$ C- n% W, ?$ {
1.6.1 数据类型
" t) ?3 R6 X( Y$ ?% q1.6.2 抽象数据类型1 o' n" U' t% g. r& V
1.7 总结回顾8 R) j7 E3 P! Z% W
1.8 结尾语& c+ W( n* v& M/ x
第2章 算法
: I6 G" T: ^/ \2.1 开场白
8 s1 ?8 b4 K z7 R$ N( f2.2 数据结构与算法关系" M* T8 O; S0 a4 X% I3 s3 i1 y
2.3 两种算法的比较. {. A# \3 j; j- T9 ^# G! ?. M* w
2.4 算法定义
. G- ]/ L, ^8 _+ \ z" b2.5 算法的特性
7 e: B4 `7 e+ {! @! O0 z2.5.1 输入输出
4 L2 k% ~. i0 O3 y8 Z0 z: ~2.5.2 有穷性) f# j6 t. G! |" [" Y- s8 G
2.5.3 确定性$ h: V* j/ [5 d+ j6 j4 |/ F
2.5.4 可行性' D5 w0 l7 U/ Z; {% N" }
2.6 算法设计的要求
( r; g' c- S6 U' g/ h1 x2.6.1 正确性2 j* V i3 |# U5 c+ [6 M
2.6.2 可读性
" N$ ]" g4 ]" d! |3 M- R2.6.3 健壮性. G7 d! ~/ @6 y- C% x' C2 r- T7 A- x
2.6.4 时间效率高和存储量低
- N% ]8 l4 W. b2.7 算法效率的度量方法
% {* T/ y6 }8 g" g$ R6 g0 Q6 f% m2.7.1 事后统计方法+ @: h7 U$ @6 [7 l& D' \$ U: {- U
2.7.2 事前分析估算方法
8 }1 S2 \- S* \; d# {, H1 D. O2.8 函数的渐近增长, W. ^/ } I/ U6 \# G% r
2.9 算法时间复杂度2 V; q. v: Q+ u' A n) l I
2.9.1 算法时间复杂度定义7 D! L3 C- j$ s1 z( T R8 j8 r p: B
2.9.2 推导大O阶方法
M$ E) X% ~' P; }2.9.3 常数阶% V) O& T; j7 n+ {* U
2.9.4 线性阶
" m* `% C. w- K+ y2.9.5 对数阶5 K; a# X) p# ~6 N0 s3 E
2.9.6 平方阶2 h( b8 M& r2 u# N
2.10 常见的时间复杂度
n( g, b4 x+ C6 w& o2.11 最坏情况与平均情况& {, H# ~, t# d1 }6 Y
2.12 算法空间复杂度$ a1 T' x1 | P; t j
2.13 总结回顾
! h4 o. z" {- h1 g# H5 x2.14 结尾语
) n# Q7 q" W9 Z; ?) D( d5 [$ S* n第3章 线性表5 S1 a- L6 |* j! N" H
3.1 开场白- A) O, U3 Y4 n/ o5 C7 l$ I$ r
3.2 线性表的定义5 w! }9 m) x" u1 V
3.3 线性表的抽象数据类型
' ] s8 Y' r3 i3.4 线性表的顺序存储结构: P3 y& y- W$ k/ @, A7 K
3.4.1 顺序存储定义: K" Y8 }# U' }- F. l% w# q) L' C7 K
3.4.2 顺序存储方式
$ r. l. R6 p$ f/ b* T3.4.3 数据长度与线性表长度区别, K2 c) `9 E; }( Q/ s5 ]
3.4.4 地址计算方法! r0 n) ]' ?5 ~$ {
3.5 顺序存储结构的插入与删除
% G3 P+ z; W$ \; \3.5.1 获得元素操作
6 B5 w& r3 E. l5 l+ x# ^! u3.5.2 插入操作
& t4 X0 W v3 q* C& s0 k3.5.3 删除操作
. D' _$ o1 {2 V0 k3.5.4 线性表顺序存储结构的优缺点; O8 d0 F9 Y( i6 i: @
3.6 线性表的链式存储结构
/ p+ j1 s! L- [3.6.1 顺序存储结构不足的解决办法3 K! { H0 R& p' v& P D
3.6.2 线性表链式存储结构定义
5 H1 E8 R/ \" z: c# P3.6.3 头指针与头结点的异同4 A& f6 A- y- [7 j% f5 s* j5 K
3.6.4 线性表链式存储结构代码描述
# P% U! H# n8 R4 h3 S9 v/ d3.7 单链表的读取
7 l8 Y) S' z$ W* P, `3.8 单链表的插入与删除
& ^) h1 [9 \0 ^" v: o$ J0 ~& M3.8.1 单链表的插入4 ^4 W/ z. s( ^$ t3 Z& f
3.8.2 单链表的删除
3 Z& U) S7 Y Q2 b3.9 单链表的整表创建
, `, w: F+ H, Q* F7 M# u2 `$ \) u3.10 单链表的整表删除; S2 v/ H" v( h7 O2 K1 P
3.11 单链表结构与顺序存储结构优缺点, ^* h4 V+ `. u: w* M t* z
3.12 静态链表
7 h3 L9 c5 [: n; B7 Q1 e4 ]+ r; W; ~3.12.1 静态链表的插入操作0 p# X2 T6 Y- k
3.12.2 静态链表的删除操作) B$ i7 h2 T8 e. u' V- o
3.12.3 静态链表优缺点/ H+ v, V, m1 s4 P g3 b
3.13 循环链表2 K* f1 S0 ?' M( ^6 F& A
3.14 双向链表
3 X7 n3 o- y" a6 c9 W) K' t' D: L) D0 l3.15 总结回顾( J! W2 e- m3 I2 Y# N- C
3.16 结尾语
5 k* _. t8 i. }' ~第4章 栈与队列
* ~8 x. g; z. H3 p4.1 开场白. F2 K* A: Z: F
4.2 栈的定义
1 [6 l/ t. A) A7 t7 y+ b# r, U7 ]4.2.1 栈的定义
$ b, l* Z" Z# t0 W" W5 h$ U B9 X4.2.2 进栈出栈变化形式" Q- n4 g$ i$ W) w
4.3 栈的抽象数据类型4 v* X, i+ ]( N" v$ E/ z
4.4 栈的顺序存储结构及实现0 y0 p7 [- ^/ y* d) |7 j! }/ l* x
4.4.1 栈的顺序存储结构1 ~, y0 O5 a# P, \" i0 h
4.4.2 栈的顺序存储结构进栈操作
) H3 X/ ~+ j" A" r6 ~8 g' R( a4.4.3 栈的顺序存储结构出栈操作
! D( B6 i0 e/ R4.5 两栈共享空间' g5 f# K9 u& X$ u1 X
4.6 栈的链式存储结构及实现
! L: O( K: {# |& `, s/ j7 ^, k4.6.1 栈的链式存储结构8 o3 ^* J( n4 j" G( s
4.6.2 栈的链式存储结构进栈操作+ A9 o# d: P! q- S& n9 y
4.6.3 栈的链式存储结构出栈操作
; T/ s7 I7 t) U2 Q4 M2 z" @4 |3 L4.7 栈的作用+ R8 }) ^, b9 o1 E, d
4.8 栈的应用--递归* Z7 }! M0 u* S, T8 v! \% X7 A
4.8.1 斐波那契数列实现
! e9 ~& ^3 p8 m* Y- U- h+ d4.8.2 递归定义
2 n5 t+ b% ^. @$ D1 d0 h' j4.9 栈的应用--四则运算表达式求值. b8 _/ N. {0 `. R
4.9.1 后缀(逆波兰)表示法定义
' N% \$ @. E9 R8 I' |4.9.2 后缀表达式计算结果& z" q& O5 e' v0 t, h2 F2 }
4.9.3 中缀表达式转后缀表达式
- T1 K. c1 l# U4.10 队列的定义1 L4 d5 Y& z: Q1 ~: \3 }
4.11 队列的抽象数据类型+ t: T/ I. N) a# T% X* I0 C( H
4.12 循环队列2 s+ u) m. I5 i% P
4.12.1 队列顺序存储的不足2 W' L4 A# l' O3 }
4.12.2 循环队列定义
4 x. N) M5 H% j3 D# w+ g- Y* U' U9 L4.13 队列的链式存储结构及实现
' L5 E" \: t/ V: Z: x+ q, J2 l3 }4.13.1 队列链式存储结构入队操作
9 }$ t# F! j3 T3 z; d4.13.2 队列链式存储结构出队操作
& |( l6 S, F! ]# V5 ?4.14 总结回顾
0 W. C) w/ ^* @+ A& k' n' C3 y% L4.15 结尾语
" U/ {) q; V3 g8 p# [第5章 串
Z" Q: x# Q# a# U. |( V' k2 W5.1开场白
- F7 H5 z8 U- z& |9 ^05.2 串的定义0 { Z8 ~6 e' f( d7 m4 I: w
5.3 串的比较
( l1 q: t" n5 U7 G ]' U5.4 串的抽象数据类型& p' R$ }2 V, w" v& }. b
5.5 串的存储结构7 ]0 I- j* \ [ x4 \2 a# S7 p8 L4 D. U
5.5.1 串的顺序存储结构" I1 E- S4 _6 Y# n; X
5.5.2 串的链式存储结构
7 A9 [. c& t6 d% H+ x* g5.6 朴素的模式匹配算法
2 N' R& P" C$ f7 F5.7 KMP模式匹配算法
! [" ?6 ]0 p, |( D0 e+ C1 V, f' j5.7.1 KMP模式匹配算法原理" T/ ?; h# D1 Q S" S; ]9 n# E
5.7.2 next数组值推导# @$ ~: ?8 K( W' J% n
5.7.3 KMP模式匹配算法实现. h% ?" ^* C: Y- k4 D. z) @
5.7.4 KMP模式匹配算法改进% @3 C/ y Y) K$ B5 ]5 f
5.7.5 nextval数组值推导
& F' e, @9 U% f$ ]5 n9 c1 V3 V: D5.8 总结回顾
0 O: y4 ^( ~& p) R6 [5.9 结尾语( t% b* i+ v+ U* T' T" @) G' G
第6章 树
8 d/ `" @ q! P- U% x6.1 开场白# X+ k- D- p% n; a4 y
6.2 树的定义
+ ^3 @- L1 C. m6.2.1 结点分类' ] L$ P8 C/ y0 e' u; s. c
6.2.2 结点间关系* l, t( F- ]3 F( d v; k2 r
6.2.3 树的其他相关概念
& a E: R( I% l6.3 树的抽象数据类型
1 H5 @" S5 ?7 d- i$ V* P, i/ @6.4 树的存储结构
2 W' L7 h& d6 [: D# d6.4.1 双亲表示法
, e- O m8 E: B* x* e+ C& v6.4.2 孩子表示法1 r1 Q/ Z! X3 V) }
6.4.3 孩子兄弟表示法 y! S" Q- r# W* ~
6.5 二叉树的定义7 _9 Q1 f, I ?4 a# a, o1 K
6.5.1 二叉树特点) l' [' u& i. `* y4 M; T
6.5.2 特殊二叉树+ K! f6 x8 s `& @/ h
6.6 二叉树的性质2 X& b2 B$ C3 w$ i' D0 Z
6.6.1 二叉树性质15 }3 l0 U/ k( o, \ P
6.6.2 二叉树性质2
& T! r# p! `& N8 ~- k; y* x2 m0 L) h6.6.3 二叉树性质3# G0 \) T8 Y* X; y
6.6.4 二叉树性质4
& i% \) l* V" N" q6.6.5 二叉树性质5! L7 V& |$ b8 T; Y6 O
6.7 二叉树的存储结构) |" U' e* J) b. V0 ^" ~
6.7.1 二叉树顺序存储结构; A8 z! _0 A/ J* b
6.7.2 二叉链表$ e' y6 J3 {, a D) }7 W$ i5 ~
6.8 遍历二叉树, }1 N3 Z2 a5 n K# ~% p+ C
6.8.1 二叉树遍历原理
: R$ j* q' n- @9 M) s- s6.8.2 二叉树遍历方法
! w8 U7 g6 T/ d* a$ p* Y6.8.3 前序遍历算法
8 M7 g: C; }% \; v6.8.4 中序遍历算法% F9 v. d7 @$ R$ i( P% f$ t
6.8.5 后序遍历算法
} N# ]: c U* c4 q8 n6.8.6 推导遍历结果
) J( t o2 B9 w. `, t6.9 二叉树的建立
0 ^2 ?# G) t: C/ L8 b6.10 线索二叉树9 I& G* v6 P. J G w
6.10.1 线索二叉树原理& _/ a$ k" ]' W- B c4 _
6.10.2 线索二叉树结构实现
# T. A$ `0 }8 q/ y5 v6.11 树、森林与二叉树的转换
- S$ a- P% b1 d; Z9 w: z6 E; x6.11.1 树转换为二叉树. e0 | v6 A* o
6.11.2 森林转换为二叉树/ w3 c. R2 \8 I( c i) f& p
6.11.3 二叉树转换为树2 R7 V0 `0 _$ X, P, g9 H
6.11.4 二叉树转换为森林
4 V3 Y; k. a9 t, b+ n* c- K" x7 I6.11.5 树与森林的遍历
) r S9 C5 K5 w1 ?( O6.12 赫夫曼树及其应用
3 ~6 l8 F% X! }9 ~6.12.1 赫夫曼树5 e+ M' j7 c6 `6 I. Y, n$ c
6.12.2 赫夫曼树定义与原理
* P0 z4 ^2 G; }7 z, C, f6.12.3 赫夫曼编码
, p( E# f1 {% G8 p! r6.13 总结回顾( t: C5 q' l8 r7 ]
6.14 结尾语- C1 S: Q% j0 T9 E% o/ L H
第7章 图
5 K7 d1 L6 F3 m: k0 ]! O$ ?7.1 开场白
4 I. R. A2 r5 Y( E, S2 V7.2 图的定义
+ ]& \# s Z; `7.2.1 各种图定义* w1 k4 H* f8 P' b; n; Y M
7.2.2 图的顶点与边间关系
b& [; U9 Y: F. m7.2.3 连通图相关术语
* o8 d. j) E4 B Z6 x7.2.4 图的定义与术语总结
/ @" b+ h, Z& {9 n |7.3 图的抽象数据类型
& C2 R) W! d8 _) u- O+ ~7.4 图的存储结构
' ?1 l' h9 J0 X/ {! Y! \7.4.1 邻接矩阵3 N5 D5 z" b% T' Q. T
7.4.2 邻接表 C7 o/ o9 R: l7 A t
7.4.3 十字链表
- [0 t3 I3 i: Z6 Y7.4.4 邻接多重表+ g( t2 D& [6 E2 o" f
7.4.5 边集数组
: j" w; H# t1 ^% E7.5 图的遍历1 \& c2 q1 e* O3 b& N. i& h6 g
7.5.1 深度优先遍历. b$ {( s" e& w. P( R( S; Q0 C/ `
7.5.2 广度优先遍历
/ U: U1 \, z! L e7 ]+ M7.6 最小生成树
. p. u. p* v! P: `7 a" t8 x7.6.1 普里姆(Prim)算法
5 q( m. Z4 ~. W) O. X. D% b7.6.2 克鲁斯卡尔(Kruskal)算法
2 {8 a4 `3 D, V) ?0 q+ c* i! i7.7 最短路径
, O( @/ k: X' i2 z* p+ _* _* a7.7.1 迪杰斯特拉(Dijkstra)算法
% Z, d3 t/ K1 |$ x7.7.2 弗洛伊德(Floyd)算法
" n( v& |3 A! U- ~7.8 拓扑排序
) X* o0 E- J6 H" ~' S% D7.8.1 拓扑排序介绍
& L% t2 {' `# x( \, Q3 c0 m& ~2 H7.8.2 拓扑排序算法; P5 m e5 j5 J7 v k
7.9 关键路径3 r2 p9 U3 N; A2 a( w
7.9.1 关键路径算法原理7 r7 C/ N( {) a) c, J; {
7.9.2 关键路径算法 ?" G6 F7 p2 G9 `- f% r
7.10 总结回顾 k7 K" S; j( A; n4 }8 s! [
7.11 结尾语
2 E% L' J7 Y( q( ^# D Z# \9 c第8章 查找2 u% Q9 b( g# G; ~5 V! n( a
8.1 开场白' |! o8 P) C/ C$ o6 N, e
8.2 查找概论
4 | {4 p' E, [/ Q2 w1 G8.3 顺序表查找
8 u* g: {" ?7 K* `9 x8.3.1 顺序表查找算法2 `6 a- ^! W! v
8.3.2 顺序表查找优化$ m/ A+ D7 N c. h. T; U
8.4 有序表查找2 z9 B1 c( |' u5 \$ b2 |
8.4.1 折半查找2 ~" r0 Y7 O+ {8 \9 W/ j4 |3 f7 e2 i
8.4.2 插值查找
& ^- v7 X' c% p. V" X8.4.3 斐波那契查找8 o/ D4 }) G u R; W" d, D
8.5 线性索引查找
( Q7 o% t! j0 b8.5.1 稠密索引
! T& c) Y% h3 M+ c4 l4 s" g8.5.2 分块索引
6 {6 L0 t( i( `8.5.3 倒排索引6 c% c) l. R6 ]4 k1 O' U/ {
8.6 二叉排序树 [4 j( ~7 K. H9 G* Z$ j `& u9 @
8.6.1 二叉排序树查找操作% i6 D7 y/ i. Q; H& e5 j# u
8.6.2 二叉排序树插入操作, v) v0 `7 \$ H$ E; X3 w4 ^
8.6.3 二叉排序树删除操作
! s& h% ~ w+ Y7 l1 `! O2 m% }6 o8.6.4 二叉排序树总结* s) E+ y8 C4 j4 k
8.7 平衡二叉树(AVL树)5 e% i. E1 ?2 a8 y+ U
8.7.1 平衡二叉树实现原理( k9 Q4 M, `/ R; A' ?' V" `
8.7.2 平衡二叉树实现算法
3 A! {1 ?; J! `3 s+ }! n0 e9 D8.8 多路查找树(B树)- p5 ^# p# b/ f$ j
8.8.1 2-3树
; H9 J0 O8 u* e4 |* A8.8.2 2-3-4树
. }) s* I/ l7 \8 }1 F- M1 g8.8.3 B树
8 R( U- G- y' c' }: T& u! z8.8.4 B+树
) t# F+ i. S6 N9 @$ n0 X8.9 散列表查找(哈希表)概述7 j3 L& \5 W" n
8.9.1 散列表查找定义1 Z9 b+ i. J) z/ F
8.9.2 散列表查找步骤$ x4 f7 J" C. W, Z
8.10 散列函数的构造方法/ ?* t: S. {' B& s8 l
8.10.1 直接定址法
* `* _# ]( c5 u1 L/ P& Q, g8.10.2 数字分析法1 V1 i. F! I A' G8 l
8.10.3 平方取中法* |3 u9 P& H8 N+ L2 x4 F
8.10.4 折叠法
7 B+ g ^* s( y8.10.5 除留余数法8 V l0 Y; |5 S( ]9 \/ Q! ?
8.10.6 随机数法- M1 P+ \: A* _; ~& y) l4 ]4 m1 X
8.11 处理散列冲突的方法
1 \9 k* }9 M' C$ i/ U/ p0 G0 h8 D8.11.1 开放定址法0 ?+ m7 h; _2 M. C5 r; s4 I# m8 b3 h
8.11.2 再散列函数法3 C$ Z Q- m0 _% p: H
8.11.3 链地址法
8 G7 ^6 c; s6 O# v8.11.4 公共溢出区法
# W+ I1 N9 [: y1 U& `8.12 散列表查找实现
1 H# @6 K& |3 W1 j8.12.1 散列表查找算法实现& N; D' |; g) ]% p& [1 \1 v2 K: F
8.12.2 散列表查找性能分析$ m2 T" `+ D, d- A! w
8.13 总结回顾
: V3 J, C2 H* ]6 y- T) |. S3 `8.14 结尾语
" H) g2 q8 K# [" j& K第9章 排序# a9 G+ S. o8 f+ d# p4 r8 r
9.1 开场白
. X$ z. f( U! `. k3 p. P- X A9 p9.2 排序的基本概念与分类9 |) e) Z, Y1 k: F
9.2.1 排序的稳定性
' N# R( m; k3 R. n+ P. r% A" X9.2.2 内排序与外排序$ X4 q4 H$ t. F2 S( L0 _
9.2.3 排序用到的结构与函数
. I. t O- R) |" I% ?" {/ [9 B9.3 冒泡排序
# n. J4 m/ p" P! ^& H9 y# U9.3.1 最简单排序实现/ [2 z. H& j/ }6 B/ j
9.3.2 冒泡排序算法" W8 j1 |; R) w: t* T* ^3 ~
9.3.3 冒泡排序优化
7 ?# |: S* d6 k% ^2 J9.3.4 冒泡排序复杂度分析8 u1 h; B) g+ o L+ P
9.4 简单选择排序2 W$ H g; I$ ~! p
9.4.1 简单选择排序算法- i0 U7 N$ [) B8 X0 f
9.4.2 简单选择排序复杂度分析! o0 |# X A, A/ m. o+ G
9.5 直接插入排序5 e$ Q) [* o; n
9.5.1 直接插入排序算法
: k7 j7 }7 p' J" z; A9.5.2 直接插入排序复杂度分析
* _! K, Y+ a* H9.6 希尔排序
! l( p: c. D9 Z W/ n3 c( c6 Y9.6.1 希尔排序原理
' i, n1 v" o5 ?, w4 h9.6.2 希尔排序算法
: }% l. a" T% e9.6.3 希尔排序复杂度分析
- ~* c. Z2 l- m5 J9.7 堆 排 序% x0 q' ^; d3 J$ x
9.7.1 堆排序算法
. G. P% H0 `' i2 y L. H9.7.2 堆排序复杂度分析
( X) |) N- ? ~) E& V0 d9.8 归并排序: L7 C5 l* b8 p# G. o) v3 e0 n7 x
9.8.1 归并排序算法
, C. Q* Z) I( J3 x% x( K9.8.2 归并排序复杂度分析! r: p/ |* D$ Z) @3 C6 v
9.8.3 非递归实现归并排序" p% X# R5 z# P$ l( h
9.9 快速排序
2 g* b% a+ X5 V, J8 r. |7 h0 H+ T9.9.1 快速排序算法
4 p* Z( b. J& Z' y$ b0 N9.9.2 快速排序复杂度分析: k% {- F, t6 _1 a8 p2 d
9.9.3 快速排序优化6 [+ Y; s1 p9 E- |- S7 M
1.优化选取枢轴
' M0 f$ t+ \5 a1 c" u/ I% B2.优化不必要的交换. F% i" r% p* j5 s
3.优化小数组时的排序方案
! X! M E1 n0 W2 L* M- u4.优化递归操作, n0 f, I/ `7 K- v9 H& h: b l$ E
9.10 总结回顾3 U4 l$ W/ m8 {. D# o
9.11 结尾语
, |0 i9 [% O; \; j! R' H3 n附录 参考文献5 Z b+ i; S2 j9 j8 N9 O
·查看全部>>
0 K- C! ^4 F/ y) A) y q- s+ v; w0 U前言
1 _5 z# [* ?0 [: Z% C1 P7 e& [/ m 本书起因
" d5 U& o1 G. ~, c y 大家好!我是《大话设计模式》(2008年初出版)的作者,三年来,承蒙广大读者的厚爱,《大话设计模式》取得了较大的成功。仅在当当网,截止本文写作时,就已经有1073次评论,705次5星评价,位居五星图书榜计算机/网络类的累计总榜第二名。此书已经成为国内原创计算机类图书最畅销的书籍之一。
5 x0 M. f! e1 @% e0 `, @# N* Z2 g 对于这样一个自己喜欢做、可以做得好,而且已经得到了市场广泛认可,为很多朋友提供帮助的事情,我没有理由不去继续做下去。这就是我准备再写书的原因。. i' G0 Z! U; ?% Q
我曾做过调查,数据结构的学习者大多都有这样的感慨:数据结构很重要,一定要学好,但数据结构比较抽象,有些算法理解起来很困难,学得很累。可我更希望传达这样的信息:数据结构非常有趣,很多算法是智慧的结晶,学习它是去感受计算机编程技术的魅力,在理解掌握它的同时,整个过程都是一种愉悦的精神感受,而非枯燥乏味的一门课程。因此我决定写作一本关于数据结构有趣的书。
4 [9 z. |8 A; z 不过现实总比理想来得更“现实”。要想把书写好,谈何容易,我需要突破很多困难……嗐!不管如何,现在您看到了本书,那就说明我已经克服了困难战胜了自己。希望您可以喜欢上这本书。7 M# X9 _8 K* f, ^
本书定位6 J7 r2 }- D# ~( I$ a6 G
本书的定位就是一本适合读者自学数据结构的书籍,它有区别于教材,希望给大家另一种阅读体验。
' e. ]( A& j* u4 ]- D 通常讲解数据结构的图书都是以教材的方式呈现。在写作前,我购买或在图书馆借阅了十几本非常好的数据结构相关教材用来为写作本书做准备。但经过认真阅读后,我发现,它们大多不是一本好的“自学读物”。
; K6 h0 Z w* E 我没有轻视这些好书的意思,不过教材和自学读物,所面向的读者是完全不同的。
- i& L& ~- ^ E3 K* v9 l# }; u1 N 好的教材应该是提纲挈领、重点突出,一定要留出思考的空间,否则就没必要再听老师上课了。很多内容的讲解是由老师在课堂完成,教材中有练习、课后习题、思考题等,这些大多可以通过老师来解答。比如我们中学时的语文、数学课本,很薄的一本书通常要用一学期、甚至一年的时间来学习,这就是因为它们是教材而不是自学读物。如果是小说,可能一两天就读完了。/ A5 m! d+ b* E5 G" E5 x: P
好的自学读物的目标是让初学者“独自”全盘掌握知识,需要强调“独自”一词,这就说明读者在阅读时,是完全依靠自己的力量来向未知发出挑战。因此书中内容,要么不写,写了就应该写透。如果读者在阅读时总是疑惑重重,那么这本书就有很大的问题了。
( }- p- ?% R A 我也就是在基于这样的认识,决心将《大话数据结构》真正写成一本关于数据结构和算法的自学读物来展开写作的。
; I: r/ B: M9 u4 v! J' n/ I1 z( F 本书特色* u# _3 |0 r7 e: K$ N" S f
1.趣味引导3 {0 o! h) ?% _
大部分的编程类图书,在内容上基本都是直奔主题。但是尼采曾说过:“人们无法理解他没有经历过的事情。”换句话说,我们只接受过去早已理解的事物相关的信息。这是一种比较学习过程,在这个过程中,大脑寻找每条信息之间的联系。所以教育专家普遍认为,吸引学生的注意力,比较好的办法是用他们比较熟知的知识开始。
$ l3 o2 ~( _( H0 @; r2 Q7 f. p t8 M2 ^ 因此在本书中,我会用一个故事、一个趣味题目、一部电影的介绍等形式来作为每一章甚至很多小节的开头,选择的内容也多多少少与要讲的主题内容相关。这并不是多余,而是有意为之。事实上,这样的形式在我的前一本书中已经得到了普遍认可。
0 `- m( n ]) m' M" g1 K# e 2.图文并茂+ E% [( \# n# O
西方有句谚语,“A picture is worth a thousand words.(一图值千言)”。用上千个字描述不明白的东西,很可能一张图就能解释清楚。 c$ ?# f$ O1 s; k. S
我非常认可这个观点,所以本书虽没有达到每一页都有图,但基本做到了绝大部分讲解都有相关图示,关键算法更是通过多图逐步分解剖析。尽管这带来了写作上的难度,但却可以达到较好的效果。毕竟,读者通过本书开始学习数据结构时,要从一无所知或略知一二到完全理解,甚至掌握应用,是需要一个比较艰苦的过程,用大量的图示可以减少这个过程的长度。) ^) @5 @- y) s4 @, S
3.代码详解
X, F0 v3 ?6 c+ A' P 我在写作中尽量摒弃了传统数据结构教材的“重理论思想而轻代码讲解”的作法。在准备数据结构写作时我发现,很多教材对数据结构理论和算法设计思想讲得比较好,可一到实际代码时,有的把代码贴出来加少量注释,有的直接用伪代码形式。这对于上课的学生还好,毕竟有老师在课堂中去详解代码编写原理,可是对于初学数据结构和算法的自学者而言,如果书中不去解释代码某些细节为什么那样编写的原因,甚至代码根本不可能在某个编译器中运行通过,其挫折感是很强烈的。比如即使理解了图结构中的最短路径求解原理,也可能无法写出最短路径的算法。+ ~5 r7 t$ H0 z% V, }
我把代码在运行过程中变量的变化融入到整个算法设计思想的讲解中,配合相应的示意图,会帮助大家更加容易理解算法的实质。这种讲解模式在本书的第6、7、8、9章的很多复杂算法中有具体体现,越是复杂的代码越是讲解细致。这算是本书的一个特色,希望对读者有帮助。
N% ~6 d/ I: T& o# P# R- l 4.形式新颖
/ {7 P" @+ Q1 S3 m+ D# c 我把本书的内容虚构成了一个老师上课的场景,所有内容都通过这位老师表达出来,书中的文字非常口语化,这样做的目的是为了更加直观地让读者感觉,自己是在学习,是在上课。有人可能会说,现在的课堂大都是让人昏昏欲睡,把读者带入上课场景,不是更加让读者犯困吗?我觉得如果你的学习经历中听过一些优秀老师的课,你就不会下这样的结论。好的老师讲课,是可以做到引人入胜的。3 v* S/ f: Z7 S5 `# ^. j9 }: `
有人可能会问,我为什么不用《大话设计模式》中的对话形式,而采用讲课形式呢?这是对数据结构这门学问的特点考虑的。设计模式主要都是思想体现,通常会仁者见仁、智者见智,用对话展开比较容易;而数据结构中更多的是定义、术语、经典算法等,这些公认的知识,可讨论的地方并不多,更多的是需要把它讲清楚。让两个人在一起讨论某个设计模式的优缺点,会非常合适,而讨论数据结构定义的好坏,就没有太大意义了,不如让一个老师告诉学生数据结构的定义好在哪里更符合实际。因此用传统的讲课形式会好一些。+ k3 }6 Y2 ?! N- X7 q$ N/ t
另外,本书没有习题,有思考的题目也一定会给出某种答案。但本书每个复杂知识点的末尾,都会提供另一本书的进一步阅读建议。这也是基于它是一本自学读物的原则。读者阅读本书可能是任何时间任何地方,如果书中存在没有解答的习题,碰到了困难是没法及时找到老师来帮助的,因此本书尽量避免让读者有这样的困惑存在。如果需要练习的同学,我觉得还是应该考虑再去买本习题集来学习。学习数据结构和算法,做题和上机写代码非常有必要,从这个角度也说明,阅读完本书其实也只是完成入门而已。
3 P: O% _& {3 k4 ~; O# s: Q u 本书既然是以老师上课的形式来进行,那就免不了要融入一名教师除了授业解惑以外,还要传达一些个人价值观的体现。书中很多细微处,如对某位科学家的尊敬、对某个算法的推崇、对勤奋励志故事的讲述等都在表达着一个老师向学生传递真、善、美的意愿。我始终认为,读者拿到的虽然只是一本没有表情、不会说话的书,但其实也是在隔空与另一个朋友交流。人与人的交流不可能只是就事论事,一定会有情感的沟通,这种情感如果能产生共鸣、达成互信,就会让事情(比如学习数据结构与算法这件事)本身更容易理解和接受。
" D8 t' I$ p6 v3 I 本书内容1 l, e+ X9 H) ]5 }2 g+ e: f' s
本书主要是按照教育部关于计算机专业数据结构课程大纲的要求略微增减来组织内容的。: K) R4 d! G( W! ?6 c% y( B" w
主要包括:数据结构介绍,算法推导大O阶的方法,线性表结构的介绍,顺序结构与链式结构差异,栈与队列的应用,串的朴素模式匹配、KMP模式匹配算法,树结构的介绍,二叉树前中后序遍历,线索二叉树,赫夫曼树及应用,图结构的介绍,图的深度、广度遍历,最小生成树两种算法,最短路径两种算法,拓扑排序与关键路径算法,查找应用的相关介绍,折半查找、插值查找、斐波那契查找等静态查找,稠密索引、分块索引、倒排索引等索引技术,二叉排序树、平衡二叉树等动态查找,B树、B+树技术,散列表技术,排序应用的相关介绍,冒泡、选择、插入等简单排序,希尔、堆、归并、快速等改进排序,各位排序算法的对比等。3 y6 U2 x6 C* }$ g/ J: Y
本书读者1 }, O5 R P: B# ~( T" S
数据结构是计算机软件相关专业的基础课程,几乎可以说,要想从事编程工作,无论你是否是科班出身,都不可以绕过这部分知识。因此,适合阅读本书的读者非常广泛,包括在读的本专科、中专职高技校等计算机专业学生、想转行做开发的非专业人员、欲考计算机研究生的应届或在职人员,以及工作后需要补学或温习数据结构和算法的程序员等各类读者。/ O7 D* s, \# u' e3 d
本书对读者的技术背影要求比较低,只要是学过一门高级编程语言,例如C、C++、Java、C#、VB等就可以开始阅读本书。不过由于当中涉及到比较复杂的算法知识,需要读者有一定的数学修养和逻辑思维能力,否则可能书籍的后半部分阅读起来会比较吃力。1 w0 \' l) N/ l9 i8 ~# o
本书研读方法
& s% U/ |- R, z% W B0 E% p 事实上,任何有难度的知识和技巧,都不是那么容易被掌握的。我尽管已经朝着通俗易懂的方向努力,可有些数据结构,特别是经典算法,是几代科学家的智慧结晶,因此要掌握它们还是需要读者的全力投入。$ x3 X: |3 x8 _. E. ~ x K& u& m
美国畅销书《如何阅读一本书》中提到“阅读可以是一件主动的事,阅读越主动,效果越好。拿同样的书给背景相近的两个人阅读,一个人却比另一个人从书中得到了更多,这是因为,首先在于这人的主动,其次,在于他在阅读中的每一种活动都参与了更多的技巧。这两件事是息息相关的。阅读是一个复杂的活动,就跟写作一样,包含了大量不同的活动。要达成良好的阅读,这些活动都是不可或缺的。一个人越能良好运作这些活动,阅读的效果也就越好。”& z& U$ }7 i5 X) s8 `# J& n, @, }% o
我当然希望读者在阅读本书后收获巨大,但这显然是一厢情愿。要想获得更多,您可能也需要付出类似我写作一样的力气来阅读,例如摘抄文字、眉批心得、稿纸演算、代码输入电脑,以及您自己在编程工作中的运用等。这些相应活动的执行,将会使您得到巨大的收获。5 x" Q' I6 J! }
作为作者,建议本书的研读方法为:
6 F6 \: |) Z4 z3 ` 1.复习C语言的基础知识。如果你掌握的是别的语言也不要紧,适当了解一些C语言和你掌握的编程语言的语法差异还是有必要的。甚至将本书代码改造成另一种语言本身就是一种非常好的学习方法。
# C4 x$ A. m* f0 b, o 2.阅读第一遍时,建议从头至尾进行。如果你对前面的知识有足够了解,当然可以跳过直接阅读后面的章节。不过若要学习一门完整的知识并形成体系。通读本书,还是最好的学习方法。- g9 [# l( F; t% w* n0 D* B( @
3.阅读时,摘抄是非常好的习惯。“最淡的墨水也胜于最强的记忆!”有不少读者会认为摘抄了将来也不会再去看,有什么必要,但其实在写字的过程就是大脑学习的过程,写字在减缓你阅读的速度,从而让你更好地消化阅读的内容。相信大家都能理解,“囫囵吞枣”和“慢慢品味”的差异,学习同样如此。
& G" ` ^- E6 m) T 4.阅读每一章时,特别是在阅读算法的推导过程时,一定要在电脑中运行代码(本书源码的下载地址可以到http://cj723.cnblogs.com中的《大话数据结构相关主题》中找到),了解代码的运行过程。本书的很多算法都做到了逐行讲解,但单纯阅读可能真的很难达到理解的程度(这是纸质书无法克服的缺陷),需要你通过开发工具调试,并设置断点和逐行执行,并参照书中的讲解,观察变量的变化情况来理解算法的编写原理。2 n9 T6 [+ Y2 J) H
5.阅读完每一章时,一定要在理解基础上记忆一些关键东西。最佳的效果就是你可以不看书也做到一点不错地默写出相关算法。$ _3 b' Z4 f( e7 a
6.阅读完每一章时,一定要适当练习。本书没有提供练习题,但市场上相关的数据结构习题集比比皆是,可以选择尝试。另外互联网上也可以获得足够的习题来给你练习。练习的目的是为了检测自己是否真的完全理解了书中的内容。事实上很多时候,阅读中的人们只是自我感觉理解,而并非真正的明白。. [; f, b" v9 H
7.学习不可能一蹴而就,数据结构和算法如果通过一本书就可以掌握,那本身就是笑话。本书附录提供了本书写作时的参考书目,基本都是最优秀的数据结构或相关的中文书籍各有侧重,建议大家可以适当地阅读。& ?3 \9 f! b. {3 P# p8 J o
8.在之后的编程学习和工作中,尽量把已经学到的数据结构和算法知识运用到现实开发中。遗忘时翻阅本书回顾相关内容,最终达到精通数据结构和相关算法的境界。8 m; ]3 F+ a+ L5 L9 P
编程语言说明0 A$ Q& M+ }8 S+ z
本书是用C语言编写,基于C90(ISO C)的标准。读者可以选择任何一款基于C90标准的C语言开发工具或更高版本的开发工具来学习本书中的代码。
$ I8 B" f' o! L; S! k7 ^ 本人一直习惯于用Visual Studio 2008作为开发工具,因此在写作此书时,也是用此工具的Visual C++来编译调试代码,一切都相安无事,但写作完成后,考虑到不同读者应用开发工具的习惯不同,最终在编辑的建议下,决定提供一份可在C90标准的C语言开发环境中编译通过的代码,结果发现错误百出。
5 }! d: { l+ B! ~5 y+ v 例如C90标准的注释要求是“/* 注释文字 */”而不允许是“//注释文字”:要求变量声明必须要在函数的最前面,只能是“int i; for(i=0;i出于为了让代码可以在低端编译环境通过的考虑,牺牲一些代码的简捷性和优雅性也是无可奈何和必要的。最终我将书中全部代码都改成C90标准的代码。
& j$ H( {. Q/ V1 S7 a C语言初学者可能会因为刚接触编程语言,特别是对指针的理解不深,而担心阅读困难。我个人感觉,单纯学习指针是很难理解它的真正用途和好处,而通过学习数据结构,特别是像链式存储结构在各种结构算法中的运用,反而可以让读者进一步的理解指针的优越之处。从这个角度说,数据结构的学习可以反过来加强读者对C语言,特别是指针概念的理解。+ Z. X, W& [, Y/ f7 v5 ^
编程语言差异' |- Q9 [4 }9 e5 x3 w
C语言是一门古老的高级语言,它的应用范围非常广泛,因此我选择它作为本书的算法展示语言。如果读者之前学过它,那么阅读本书就不存在语言障碍。懂得C++语言的读者,同样也不会有任何语言上的问题。/ W. ?/ j$ M \
像掌握Java、C#、VB等面向对象语言的读者,当面对书中大量的C语言式的结构(struct)声明和针对结构的参数传递的代码时,都可以理解为是类的定义和由类生成对象的传递。尽管的确存在差异,但是并不影响整体对数据结构知识和算法原理的理解。
7 ?$ K2 ~9 }2 d& h9 Z8 A4 {! F 我个人感觉,哪怕是对C语言不熟悉,也不妨利用学习数据结构的机会,学习一下C语言的编程方法,这对于将来应用其他高级语言也是有很大帮助的。
% \: N0 q# U e 不是一个人在战斗* l9 U2 X9 v$ x/ T; j0 L$ R
首先要感谢我的妻子李秀芳对我写作本书期间的全力支持,我辞职写作,没有她精神上的理解鼓励和生活上的悉心照顾,是不可能走出这一步并顺利完成书稿的。我们的儿子程晟涵如今已经三周岁,我是在他每日的欢声笑语和哭哭啼啼中进行每一章节的构思和写作,希望他可以茁壮成长。我的父母已经年迈,他们为我的全职创作也甚为担心和忧虑,这里也要说一声抱歉。) {8 P2 O$ h/ i$ ^- Q% v; B
本人数据结构的知识,是源自清华大学出版社出版的《数据结构(C语言版)》(严蔚敏、吴伟民编著)一书,严老师和吴老师算是我在数据结构方面的启蒙老师,本书的不少内容和代码也是参考了此书。机械工业出版社的《算法导论》对于本人的算法知识提高帮助很大,写作中也大量吸收了书中的精华。写作过程中,本人购买和借阅了与数据结构相关的大量书籍,详细书目见附录。没有前辈的贡献,就没有本书的出版,也希望本书能成为这些书籍的前期读物。在此向这些图书作者表示衷心的感谢。) ?0 [' b; N" [- b7 c. {
仅有作者是不可能完成图书的出版的,本人要非常感谢清华大学出版社的朋友们,他们是本书的最初读者,也是协助本人将此书由毛糙变精良的最有力帮手。
) U: O2 v; l' |8 [ W/ t/ i- K/ D 本书的封面设计程瑜、插图设计周翔,都是在反反复复的修改中完成创作的。
3 U9 b" s1 w R9 w 写作中,还得到了周筠、卢鸫翔、张伸、胡文佳、Milo、陈钢、刘超、刘唯一、杨绣国、戚妩婷、雷顺、杨诗盈、高宇翔、林健的友情帮助,他们都在本人的书稿创作中提出了宝贵建议。
( |9 n. F# G7 @9 G( d 在此向所有帮助与支持我的朋友道一声:谢谢!" T4 K/ |2 D" S% M0 O/ O5 _6 z" F
程杰
- \9 s) M4 C! S! h: |4 I" ` |
|