伪码记录一些重要算法的思路(持续整理)

阅读更多
基于内容精简、重点突出、便于理解的这些优点,选择中文伪码来记录。
一般地,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]
          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轴交点
         若精度不够则继续计算。
_______________________________________________
 
 
 
 
 
 

你可能感兴趣的:(算法,思路,排序)