- 博客(10)
- 资源 (8)
- 收藏
- 关注
原创 链表常见问题----链表相交,链表有环,链表反转以及链表倒数第n个节点
听小伙伴说经常在面试中会碰到如下几个问题: 1. 查找一个单向链表的倒数第n个节点 2. 链表反转 3. 链表是否有环,及环的入口 4. 两个无环的链表是否相交,及相交的第一个节点那么这篇就来聊聊以上几个问题。1.如何查找一个单向链表的倒数第n个节点 这个问题比较简单。 例如:要查找一个单向链表的倒数第4个节点。 那么只需要两个指针都指向头节点,一个指针从头节点开始先往后移动4个节点,然后两个指针同时移动。当先走4个节点的指...
2021-02-18 19:06:43
307
原创 字符串模式匹配:kmp算法及优化
再谈KMP算法之前,先聊聊BF算法 BF(Brute Force)算法 BF算法顾名思义,暴力破解。假设有字符串s,模式串p,长度分别为N和K。从s[0]开始,与p[0]相比,如果相等则继续比较s[1]与p[1],依次类推。 如果出现不相等,则回溯到s字符串的下一个字符开始比较。最坏情况要进行N*(N-M+1)比较,算法时间复杂度为O(N*K)。代码实现如下: 例子: 假设字符串s为"abcdefgh",字...
2021-02-17 19:13:58
381
原创 排序算法<8>:对比与总结
排序算法对比 表格 排序算法 时间复杂度 空间复杂度 排序方式 稳定性 平均情况 最好情况 最坏情况 冒泡排序 O(n*n) O(n) o(n*n) O(1) 内排序 ...
2021-02-15 10:59:02
307
原创 排序算法<7> :快速排序及优化(迭代与递归版本实现)
快速排序原理 每趟排序选择一个基准数,升序排列,则将比基准数大的数放在基准数右边,比基准数小的数放在基准数左边。然后分别在基准数左边的数中选择一个基准数,重复前面的步骤,基准数右边的数中选择一个基准数,重复前面的步骤。直到基准数左右两边只有一个数,整个集合数据有序。看起来是个递归调用的过程。 快速排序第一版递归实现(升序排列) 快速排序在排序时间复杂度都为O(N*logN)的几种排序方法中效率较高。所以经常被采用。根据快速排序原理,代码实现如下:...
2021-02-14 20:34:07
544
原创 排序算法<6> :堆排序
堆的概念 堆通常是可以被看成一颗完全二叉树的数组。堆满足如下特质: 1. 堆是一颗完全二叉树。 2. 堆中某个节点的置总是大于等于父节点的值,或小于等于父节点的值。按照堆的特点,可以把堆分为大顶堆和小顶堆。 大顶堆:每个节点的值都小于等于其父节点的值。 小顶堆: 每个节点的值都大于等于其父节点的值。 堆排序原理 将集合数据进行排序可以使用堆排序。 一般升序排列,采用大顶堆实现。降序排列使用小顶堆实现。以升序排序为例,如何将...
2021-02-08 19:13:20
92
原创 排序算法<五> :归并排序(迭代与递归实现)
归并排序原理 归并排序建立在归并操作上的一种有效,稳定的排序算法,是采用分治法的一个非常典型的应用。将集合数据拆分成若干个子序列,并使各个子序列有序,依次合并,并进行排序,直到合并为整个数据集合有序。(此处应该有图,但是画图耗时间,先不画了,以后有空再来补。) 归并排序(递归版)实现(升序排列) 归并排序时间复杂度O(nlog n),性能仅低于快速排序。性能比希尔排序更好。根据归并排序原理,每经过合并才做,集合数据都会更接近有序,直到所有子序列合并成一...
2021-02-07 00:16:44
673
原创 排序算法<四> :希尔排序
希尔排序原理 希尔排序是插入排序的一种优化实现,比直接插入排序算法更高效。也是第一批算法时间复杂度突破O(n^2)的算法之一。因 D.L.Shell 于 1959 年提出而得名。 希尔排序是把集合数据按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量的减少,集合数据越来越接近整体有序。当增量减至 1 时,整个集合数据被分成一组,进行一遍插入排序,集合整体有序,算法终止。 希尔排序实现(升序排列) 希尔排序时间复杂度O(...
2021-02-06 12:15:55
220
原创 排序算法<三> :直接插入排序
直接插入排序原理 直接插入排序,是将一个数据插入到已排好的有序表中,从而得到一个新的、记录数量增1的有序表。将数据集合中的数据依次插入到有序表中,将数据集合变为2个数据有序、3个数据有序,依次变为整个集合有序。 直接插入排序实现(升序排列) 直接插入排序时间复杂度O(n^2)。直接插入排序的性能比冒泡排序和简单选择排序要略好(待排序算法写完后,会有一篇排序算法的总结对比,分析不同排序算法的性能对比,稳定性等)。根据直接插入排序原理,每经过一次循环,都会增加...
2021-02-05 16:40:13
139
原创 排序算法<二> :简单选择排序
简单选择排序原理 每次循环查找最小的元素,顺序放在已排序的记录序列末尾,直到全部排序结束为止。 简单选择排序实现(升序排列) 简单选择排序时间复杂度O(n2)。由于数组元素排序所需移动次数优于冒泡排序,在性能上略优于冒泡排序算法。根据根据简单选择排序原理,内层循环 每次循环比较,记录最小元素的小标,找到最小元素。若记录的最小元素下标与待排序元素下标不相等,则交换位置。经过外层循环len - 1次排序后,数组将会有序。代码实现如下:/* *@功能说明 *...
2021-02-05 15:42:37
171
4
原创 排序算法<一> :冒泡排序及优化
刚开始写博客。先从简单的开始。总结下几种排序算法。 冒泡排序名字由来 这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。 冒泡排序原理 比较相邻的元素。如果第一个比第二个大,就交换他们两个。 (升序排列) 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。 针对所有的元素重复以上的步骤...
2021-02-05 14:04:27
109
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人