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

本文介绍了几种常见的算法和数据结构,包括二分查找、归并排序、堆排序、快速排序等算法,以及如何求解最大子段和问题、寻找树中两个节点的最低公共祖先等问题。此外还涉及了素数筛选法、链表长度求解等实用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基于内容精简、重点突出、便于理解的这些优点,选择中文伪码来记录。
一般地,left、right分别表示待操作数组的起止索引,或是链表的头尾指针。
_______________________________________________ 
  • 二分查找
当数组有元素时(left<=right)循环:
          若查找值小于中位数,则查找左半边数组;
          若查找值大于中位数,则查找右半边数组;
          否则查找值等于中位数,即找到。
返回未找到。
_______________________________________________
  • 归并排序
当数组多于一个元素时(left<right):
          递归排序左半边(含中间);
          递归排序右半边;
          合并两边。
_______________________________________________
  • 堆排序
从最后一个非叶节点(length/2-1)往前循环:// 建大顶堆的过程
         全范围length内AdjustHeap调整当前节点
由后往前循环(i=length-1;i>0;--i):
         当前节点与根节点交换;
         在范围i内,AdjustHeap调整根节点
 
AdjustHeap:
         若当前节点有孩子,循环:
                   选择一个较大的孩子;
                   若该孩子比当前节点大,则交换并将当前节点设为该孩子,否则结束
_______________________________________________
  • 快速排序
当数组多于一个元素时(left<right):
          q = Partition();
          递归排序q左边;
          递归排序q右边。
_______________________________________________
  • Partition 作用是返回一个位置,经过调整数组左边都比该值小,右边都比该值大
Partition://实现方式有多种,此为严蔚敏《数据结构》版本
         选择第一个记录作为枢轴,值为key;
         当left<right时循环:
                   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轴交点
         若精度不够则继续计算。
_______________________________________________
 
 
 
 
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值