基于内容精简、重点突出、便于理解的这些优点,选择中文伪码来记录。
一般地,left、right分别表示待操作数组的起止索引,或是链表的头尾指针。
_______________________________________________
- 二分查找
当数组有元素时(
left<=right)循环:
若查找值小于中位数,则查找左半边数组;
若查找值大于中位数,则查找右半边数组;
否则查找值等于中位数,即找到。
返回未找到。
_______________________________________________
- 归并排序
当数组多于一个元素时(
left):
递归排序左半边(
含中间);
递归排序右半边;
合并两边。
_______________________________________________
- 堆排序
从最后一个非叶节点(
length/2-1)往前循环:// 建大顶堆的过程
全范围length内AdjustHeap调整
当前节点。
由后往前循环(
i=length-1;i>0;--i):
当前节点与根节点交换;
在
范围i内,AdjustHeap调整
根节点;
AdjustHeap:
若当前节点有孩子,循环:
选择一个较大的孩子;
若该孩子比当前节点大,则交换并将当前节点设为该孩子,
否则结束
_______________________________________________
- 快速排序
当数组多于一个元素时(
left):
q =
Partition();
递归排序q左边;
递归排序q右边。
_______________________________________________
- Partition 作用是返回一个位置,经过调整数组左边都比该值小,右边都比该值大
Partition://实现方式有多种,此为严蔚敏《数据结构》版本
选择第一个记录作为枢轴,值为key;
当
left时循环:
right从右到左,直至比key小时停下,并设置 a[left] = a[right];
left从左到右,直至比key大时停下,并设置 a[right] = a[left];
right从右到左,直至比key小时停下,并设置 a[left] = a[right];
left从左到右,直至比key大时停下,并设置 a[right] = a[left];
a[left] = key;
返回left。
Partition://《算法导论》版本
选择最后一个记录作为枢轴,值为key;
p = left;//用p来记录key最终应该摆放的位置
从left至right-1遍历数组:
若当前值小于key
交换a[p]与当前值,并将p后移一位;
交换
a[p] = a[right];
返回p。
_______________________________________________
- 素数筛选法
int a[N+1] = {1,1}; //准备一个标志数组,1表示非素数
由2至N,循环:
若该数为素数
将其所有倍数标志为非素数;//小优化是从
平方数开始筛掉该数的
奇倍数
a中所有
值不为1的位置即是素数。
_______________________________________________
- 求链表长度
指针p1每次一步,p2每次两步,若快慢指针均不为空,循环:
若两指针相遇于a点,表示链表中含
有环
p1p2从a点接着走,
再次相遇时经过的步数即为环长;
p1置于
a点,p2置于
表头每次一步,相遇时位于
环入口点,经过的步数即为
环外表长;
返回环长与环外表长之和,即为链表长度。
无环,p1走到尽头便知表长。
_______________________________________________
- 最大子段和
‘最大和’与‘当前和’都初始化为负无穷;
遍历数组;
‘当前和’若为正数,则加上当前数字,否则重置为当前数字;
‘当前和’若大于‘最大和’,则‘最大和’置为‘当前和’。
‘最大和’即为解。
_______________________________________________
- 树中两个节点的最低公共祖先
深度优先遍历该树,用栈记录两个节点到根节点的路径;//若树节点中有指向父节点的指针,此步骤省略
问题转化为两个链表的第一个公共节点,解法如下:
求出两链表的长度,差值为k;
长链表先走k步;
两链表同步走://由于在公共节点相遇后,两链表后半段完全相同,长度也一样
若当前节点相同,此即为解。
_______________________________________________
- 含有min函数的栈
用
两个同步栈来实现,s_data为数据栈,s_min栈
记录每个时刻的s_data中的最小值。
Push(value):
s_data.push(value);
若s_min为空或s_min.top()大于value,则s_min.push(value),否则s_min.push(s_min.top())。
Pop():
若栈不为空,s_data.pop(),s_min.pop()。
Min():
若栈不为空,返回s_min.top()。
_______________________________________________
- 全排列
当
left>right时,输出当前排列,结束。
从left至right循环:
交换当前值与a[left];
递归求解(left+1,right)的全排列;
交换当前值与a[left]。
_______________________________________________
- 牛顿迭代法求平方根
(求a的平方根,即为求f(x)=x^2-a的根)
x初始值任取,非零即可;
循环:
过(x,f(x))点做f(x)的切线;
x更新为切线与x轴交点;
若精度不够则继续计算。
_______________________________________________