算法导论学习笔记——第7章 快速排序

快速排序

 1 QUICKSORT(A,p,r)
 2 if p<r
 3     then q←PARTITION(A,p,r)
 4         QUICKSORT(A,p,q-1)
 5         QUICKSORT(A,q+1,r)
 6
 7 PARTITION(A,p,r)
 8 x←A[r]
 9 i←p-1
10 for j←p to r-1
11     do if A[j]<=x
12         then i←i+1
13             exchange A[i]↔A[j]
14 exchange A[i+1]↔A[r]
15 return i+1

随机化快速排序,不再选择r为主元,而是随机选择一个主元,并放到r位置

 1 RANDOMIZED-PARTITION(A,p,r)
 2 i←RANDOM(p,r)
 3 exchange A[r]↔A[i]
 4 return PARTITION(A,p,r)
 5
 6 RANDOMIZED-QUICKSORT(A,p,r)
 7 if p<r
 8     then q←RANDOMIZED-PARTITION(A,p,q-1)
 9         RANDOMIZED-QUICKSORT(A,p,q-1)
10         RANDOMIZED-QUICKSORT(A,q+1,r)
时间: 2024-10-10 06:07:07

算法导论学习笔记——第7章 快速排序的相关文章

算法导论学习笔记 第7章 快速排序

对于包含n个数的输入数组来说,快速排序是一种时间复杂度为O(n^2)的排序算法.虽然最环情况的复杂度高,但是快速排序通常是实际应用排序中最好的选择,因为快排的平均性能非常好:它的期望复杂度是O(nlgn),而且O(nlgn)中的常数因子非常小.另外,快速排序还可以实现原址排序,甚至在虚拟环境中也能很好的工作. 1 快速排序的描述 与归并排序一样,快速排序也使用了分治法的思想,下面是对一个典型的子数组A[p.. r]进行快速排序的分治过长: 分解:数组A[p.. r]被划分为两个(可能为空)子数组

算法导论学习笔记——第12章 二叉查找树

二叉查找树性质 设x是二叉查找树中的一个结点,如果y是x的左子树中的一个结点,则k[y]<=key[x]:如果y是右子树中的一个结点,则k[y]>=k[x] 1 //中序遍历算法,输出二叉查找树T中的全部元素 2 INORDER-TREE-WALK(x) 3 if x!=nil 4 then INORDER-TREE-WALK(left[x]) 5 print key[x] 6 INORDER-TREE-WALK(right[x]) 查找 1 //递归版本 2 TREE-SEARCH(x,k)

算法导论学习笔记——第1章

所谓算法,就是定义良好的计算过程,它取一个或一组值作为输入,并产生出一个或一组值作为输出.亦即,算法是一系列的计算过程,将输入值转换成输出值. 一些常见的算法运行时间量级比较:对数级<多项式级<指数级<阶乘级 1 lgn < n 1/2 < n < nlgn < n 2 < n 3 < 2 n < n!

算法导论学习笔记——第8章 线性时间排序

任意一种比较排序算法,在最坏情况下的运行时间下限是Ω(nlgn) 计数排序 假设n个输入元素中的每一个都是介于0到k之间的整数,k为某个整数,当k=O(n)时,计数排序的运行时间为Θ(n) 1 //输入数组A[1..n],存放排序结果数组B[1..n],临时存储区C[0..k] 2 COUNTING-SORT(A,B,k) 3 for i←0 to k 4 do C[i]←0 5 for j←1 to length[A] 6 do C[A[j]]←C[A[j]]+1 7 for i←1 to k

算法导论学习笔记——第11章 散列表

直接寻址表 1 DIRECT-ADDRESS-SEARCH(T,k) 2 return T[k] 3 4 DIRECT-ADDRESS-INSERT(T,x) 5 T[key[x]]←x 6 7 DIRECT-ADDRESS-DELETE(T,x) 8 T[key[x]]←nil

算法导论学习笔记——第6章

堆 堆数据结构是一种数组对象,可以被视为一棵完全二叉树. 对于给定的数组A,树的根为A[1],对于给定的下标为i的结点A[i],其父结点PARENT(i)=floor(i/2),左子结点LEFT(i)=2i,右子结点RIGHT(i)=2i+1 叶级结点的高度可以认为是0,每向上一层,高度加一,定义树的告诉为根结点的高度. P74

算法导论学习笔记——第4章

解递归式 1.代换法substitution 1)猜测解的形式 2)用数学归纳法找出使解真正有效的常数 2.递归树 使用递归树时,可以忽略一些“小误差”,将递归产生的结果作为猜测,用代换法进行验证. 也可以严格计算每一层递归树的代价,加总成递归式的结果. 对于有两个子问题,子问题规模为1/2的递归树(二叉树),树的高度是lgn,叶级节点的数量是n 3.主方法master method 递归式形式T(n)=aT(n/b)+f(n),其中a>=1,保证有一个及以上子问题:b>1,保证问题的规模逐步

算法导论学习笔记——第10章 基本数据结构

栈 1 Stack-EMPTY(S) 2 if top[S]=0 3 then return TRUE 4 else return FALSE 5 6 PUSH(S,x) 7 top[S]←top[S]+1 8 S[top[S]]←x 9 10 POP(S) 11 if STACK-EMPTY(S) 12 then error "underflow" 13 else top[S]←top[S]-1 14 return S[top[S]+1] 队列 1 ENQUEUE(Q,x) 2 Q[

算法导论学习笔记——第3章

一些数学问题 1.对任意两个函数f(n)和g(n),f(n)=Θ(g(n))当且仅当f(n)=O(g(n))和f(n)=Ω(g(n)) 2.实数集有一个属性不能应用在渐进符号上 三分性:对于实数a和b,下列三种情况有且仅有一种情况成立,a>b,a=b,a<b 并不是所有的函数都可以进行渐进比较 3.近似的函数增长 对数<线性<多项式<指数<阶乘