AI 摘要

一;位运算思维:2的整数次方的数的二进制中只有一个1,如4——>100 8——>1000。两个相同的二进制数相加等于该数左移一位(乘以10)。例如,两个3相加:011+011=110。 顺序表 关键:连续存储:顺序表要求数据从头开始存储并且是连续存储的,不能跳跃间隔,类似于数组。避免了频繁扩容的问题,尽量使空间利用更加高效。相关项目包括linbei-pro/SeqList和linbei-pro/DynamicArray。 链表:相对于顺序表,链表的设计避免了频繁扩容和数据挪动的问题,提高了插入和删除数据的效率。linbei-pro/List-pro提供了一个双向带头循环链表的实现。 排序:插入排序包括直接插入排序和希尔排序;分治排序包括快速排序和归并排序;堆排序和计数排序等。这些排序算法在不同情况下展现出各自的优势,例如计数排序适用于一定范围内的整数排序。相关项目有linbei-pro/InsertSort、linbei-pro/quickSort等。 基数排序和桶排序:基数排序将数据按照位数匹配到二维数组中,实现从不同位数的有序到整体有序;桶排序则将待排序元素分散到多个桶中,再合并成最终的有序序列。通过使用不同的方式和数据结构,实现了不同类型的排序算法。相关项目包括linbei-pro/radixsort。

一;位运算思维

  1. 2的整数次方的数的二进制中只有一个 1 如 4 ——> 100 8 ——> 1000
  2. 2个相同的2进制数做不进位加法,结果为0 10个相同的10进制数做不进位加法,结果为0 k个相同的k进制数做不进位加法,结果为0

两个相同的二进制数相加等于该数左移一位(x10)

如 两个3相加 : 011+011= 110

二:顺序表 关键:连续存储

顺序表就是数组,但是在数组的基础上,它还要求数据是从头开始存储并且是连续存储的,不能跳跃间隔

linbei-pro/SeqList: 用C语言实现的一个动态的顺序表 (github.com)

linbei-pro/DynamicArray: 在C语言中,使用结构体和动态分配内存来模拟动态数组,从而实现类似容器的功能 (github.com)

三:链表

顺序表的缺陷:1.空间不够了就要增容,增容就要付出代价

  1. 避免频繁扩容,空间满了基本是扩2倍,也可能出现空间的浪费
  2. 顺序表要求数据从开始位置连续存储,那么我们从头部插入或删除数据就要挪动数据,效率不高

所以,针对顺序表的缺陷,就设计出了链表

linbei-pro/List-pro: 用C语言写的一个双向带头循环链表,并实现尾插,尾删,头插,头删等功能 (github.com)

四:排序

1.插入排序

直接插入排序:类似于一摞牌,一张一张摸,并排序

希尔排序:希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一 种更高效的改进版本。 优点:大量元素越来越有序,速度越来越快。

linbei-pro/InsertSort: 用C语言写的一个直接插入排序 (github.com)

2. 分治

快速排序:重点在于划分区域

linbei-pro/quickSort: 用C语言写的一个快速排序的程序 (github.com)

归并排序:重点在于合并

linbei-pro/mergesort: 归并排序 (github.com)

3.堆排序

堆排序:二叉堆是完全二叉树或者是近似完全二叉树(每个根都有左子树和右子树)

二叉堆满足两个性质:

1 .父节点的键值总是大于或等于(小于或等于)任何一个子节点的键值。

2.每个节点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆)。

linbei-pro/heapsort: 堆排序 (github.com)

4.计数排序

计数排序:是一个非基于比较的排序算法,该算法于1954年由 Harold H. Seward 提出。它的优势在于在对一定范围内的整数排序时,它的复杂度为Ο(n+k)(其中k是整数的范围),快于任何比较排序算法。当然这是一种牺牲空间换取时间的做法。

  但计数排序有两个问题:

  1,如果序列中有负数 ?

  2,如何数据跨度很大 ?

优化:为了解决上述的负数问题和空间浪费问题,这里我们采用相对映射的方法。具体思路就是,找到序列的最大值和最小值,则开辟的空间数range=max-min+1。关键的一步来了,我们在映射时,将每个数据减去序列的最小值,将这个值做为新数组的下标。在还原时,只需要加上这个最小值,就能还原出原来的值,同时还解决了负数问题。

linbei-pro/countsort: 优化过后的计数排序 (github.com)

5.基数排序

1.按照个位,十位,百位,千位.......将数据匹配到二维数组对应行中

2.然后按从0到9从小到大的顺序收集二维数组中每一行的数据

3.依次实现从个位数有序,十位数有序,百位数有序......,从而达到序列整体有序

linbei-pro/radixsort: 基于桶排序的基数排序 (github.com)

6.桶排序

   什么意思:桶排序是一种排序算法,它将待排序元素分散到多个桶中,然后对每个桶内的元素进行排序,最后按照桶的顺序将所有元素合并成最终的有序序列。这种排序算法通常适用于元素分布均匀的情况。

   怎么把所有元素放入桶中: value/(max+1)*n     (n个桶)

         vaule/(max+1) 结果一定是0~1之间,再乘上一个n,结果一定小于n

         如此算出value应该在哪个桶,得出得是桶的下标

linbei-pro/bucketSort: 用C语言实现的桶排序算法 (github.com)

五:dfs

基本概念

深度优先搜索算法(Depth First Search,简称DFS):一种用于遍历或搜索树或图的算法。 沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过或者在搜寻时结点不满足条件,搜索将回溯到发现节点v的那条边的起始节点。整个进程反复进行直到所有节点都被访问为止。属于盲目搜索,最糟糕的情况算法时间复杂度为O(!n)。

算法思想

回溯法(探索与回溯法)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。

linbei-pro/dfs: (github.com)

届ける言葉を今は育ててる
最后更新于 2024-04-04