数据结构与算法
W_hale
( • ̀ω•́ )✧
展开
-
快慢指针TwoPointers
概念TwoPointers 指的是一快一慢的两个指针去推进一个链表,我把它分为两类。第一类:起点不一样,fast比slow先走n步第二类:步长不一样,fast比slow推进的快,例如fast = fast->next->next; slow = slow->next,fast的步长为2,而slow的步长为1。TwoPointers可以解决哪些问题?找到链表的中点...转载 2019-01-29 15:40:40 · 127 阅读 · 0 评论 -
排序算法动图详解与代码实现(插入排序篇)
1.直接插入排序思想:基于已排序好的有序表,从有序元素的下一个元素开始,从后向前扫描,如果已排序的元素大于新元素,则已排序元素后移一位,直到找到已排序的元素小于或者等于新元素的位置,将新元素插入到该位置后,重复循环至所有元素有序。优点:稳定,迅速,只需用到O(1)的额外空间的排序。缺点:比较次数不一定,数据量庞大时移动量大。代码实现:void insert_sort(int* arr,i...原创 2019-03-08 21:12:59 · 214 阅读 · 1 评论 -
排序算法动图详解与代码实现(交换排序篇)
1.冒泡排序思想:从第一个元素开始,两两比较相邻元素a1,a2,当a1>a2时,交换顺序,比较下一组元素,循环操作,直到整个数组有序。优点:稳定缺点:效率低代码实现:void bubble_sort(int* arr,int len){ if(arr == NULL || len < 0) return ; bool flag = true...原创 2019-03-09 16:32:51 · 144 阅读 · 0 评论 -
排序算法动图详解与代码实现(选择排序篇)
1.直接排序思想:遍历数组元素,找到其中最小(大)元素,将其放在数组起始位置,再从剩余数组元素中继续寻找最小(大)元素,放在已排序序列末尾,重复至整条序列有序。代码实现:void select_sort(int* arr,int len){ if(arr == NULL || len<0) return ; int min = arr[0]; ...原创 2019-03-10 16:30:46 · 151 阅读 · 0 评论 -
排序算法动图详解与代码实现(归并、基数)
1.归并排序思想:建立在归并操作的基础上,采用分治法。把长度为n的输入序列分成两个长度为n/2的子序列,然后分别对这两个子序列分别采用归并排序,最后将两个排序好的子序列合并成一个最终的排序序列。代码实现:#include <stdlib.h>#include <stdio.h>void Merge(int sourceArr[],int tempArr[], ...原创 2019-03-11 18:34:52 · 140 阅读 · 0 评论 -
如何在不知道头节点的情况下删除链表中的某一指定节点?
单链表不可能完全实现传统解法一:将待删节点后续节点Copy至待删节点,删除后续节点。存在问题:当指定节点为链表最后一个节点时,无法删除。传统解法二:将待删节点的内存指向NULL。存在问题:NULL在系统上是一个特定的区域,如果想让待删节点的先续节点指向NULL,必须找到该节点,否则等同于改变了待删节点的值而删除了待删节点的后续节点。双向链表实现linker_p delete_Nod...原创 2019-04-16 17:59:16 · 1713 阅读 · 1 评论 -
七大查找算法思想(内含红黑树,B树,B+树分析)
总结这篇的原因是今天实验室的好几个同学都被问到红黑树的相关问题于是慌的一批Orz首先复习一些概念查找算法分类: 1)静态查找和动态查找; 静态或者动态都是针对查找表而言的。动态表指查找表中有删除和插入操作的表。 2)无序查找和有序查找。 无序查找:被查找数列有序无序均可; 有序查找:被查找数列必须为有序数列。平均查找长度(Average Search Leng...原创 2019-04-17 09:23:18 · 876 阅读 · 0 评论