数据结构
惊风无尘
研发工程师一枚,热爱编程,喜欢探讨,有问题加群522192138,一起交流,一起进步
展开
-
链表翻转和链表环入口点
链表环和环入口点0.单链表节点定义: struct Node { int _val; Node* next; Node() { next = NULL; } Node(int val):_val(val),next(NULL){} };1.单链表翻转用双指针, 一个指针指向当前节点, 一个指针指向当前节点的前一个节点, 用临时变原创 2021-01-12 11:40:10 · 140 阅读 · 0 评论 -
KMP
KMP思想:在字符串A中查找字符串b是否存在时,当遇到不相同的字符时,我们希望找一些规律,可以将字符串b的比较索引多往后移动几位,跳过哪些肯定不会匹配的情况。如A = “abababac” , B = “ababac”,在字符串A中查找B时, 先会在以索引0开头,长度为6的子串(“aba”)中查找B,当比较A[2] 和B[2]不相同的时候。会在以索引1开头,长度为6的子串(“bab”)中查找B...原创 2019-12-28 16:01:17 · 201 阅读 · 0 评论 -
桶排序、计数排序、基数排序
桶排序核心思想:将要排序的数据分到几个有序的桶中,每个桶中的数据再单独进行排序。桶内排完序后,再按顺序依次取出每个桶中的数据,组成的新序列就是排好序的数据了。时间复杂度O(n)桶排序应用条件:首先,要排序的数据要很容易划分到m个桶中,并且桶与桶之间有着天然的大小顺序。其次:数据在各个桶之间的分布是比较均匀的。桶排序比较适用于外部排序中。所谓的外部排序就是数据存储在外部磁盘中,数据量大,...原创 2019-11-16 20:43:22 · 208 阅读 · 0 评论 -
LeetCode求和
LeetCode 求和, 给一个数组,和一个目标数,在这个数组中找到两个数的和 是这个目标数, 返回索引两层循环的时间复杂度太高用hashtable需要进行装箱和拆箱操作所以最后用dictionary了 public int[] TwoSum(int[] nums, int target) { if(nums == null) { ...原创 2019-08-09 12:48:39 · 293 阅读 · 0 评论 -
LeetCode 两数相加
在leetcode上看了一个题目,对链表求和,之前是用字符串表示大数,进行求和,然后就写了下代码,顺便复习下链表的基本知识。原题如下:给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。...原创 2019-08-09 07:57:42 · 268 阅读 · 0 评论 -
希尔排序
思想:把元素按步长分组,对每组元素按直接插入排序算法排序。 时间复杂度:O(nlgn),最差O(n^1.3) 稳定性:不稳定void ShellSort (int* A, int length){ if (A == NULL || length < 1) { return; } int gap = length / 2; while(gap原创 2016-03-07 07:54:10 · 294 阅读 · 0 评论 -
基数排序
#include <iostream>using namespace std;void RadixSort(int* A, int startIndex, int endIndex, int digit);int GetDigit(int data, int digit);int main (){ int arr[] = {3,1,5,2,4,55,3,1,9,8,99,4,99,100原创 2016-03-06 22:28:36 · 226 阅读 · 0 评论 -
计数排序
#include <iostream>using namespace std;void CountingSort(int*A, int length, int MaxData);int main (){ int arr[] = {3,1,5,2,4,55,3,1,9,8,99,4,99,8,7}; int len = sizeof(arr)/sizeof(arr[0]);原创 2016-03-06 21:26:02 · 213 阅读 · 0 评论 -
选择排序
void SelectSort(int* A, int length){ if (A == NULL || length < 1) { return; } for (int i = 0; i < length; ++i) { int minIndex = i; for (int j = i+1; j < leng原创 2016-03-06 19:54:42 · 242 阅读 · 0 评论 -
冒泡排序
#include <iostream>using namespace std;void BubbleSort(int* A, int length);void Swap(int* A, int lIndex, int rIndex);int main (){ int arr[] = {3,1,5,2,4,99,8,7}; int len = sizeof(arr)/size原创 2016-03-06 19:51:43 · 279 阅读 · 0 评论 -
快速排序
快速排序算法也是基于分治策略的。首先把原数组分解成两个子数组(可能空)A[p,q-1]和A[q+1,r];其中A[p,q-1]里边的元素都小于等于A[q],A[q+1]里边的元素都大于A[q];下标q也在这个分隔中进行计算。 然后,通过递归调用快速排序,对子数组A[p,q-1]和A[q+1,r]进行排序。 最后合并两个子数组的排序结果,因为两个子数组是就地排序的,将他们的合并不需要操作,整个数组原创 2016-03-06 17:35:35 · 232 阅读 · 0 评论 -
周期串
如果一个字符串由n个长度为K的字符串重复组成,则长度为k的字符串为重复串。如:字符串“abcabcabc"的重复串为“abc" 或”“abcabcabc";从上边的例子可知:重复串满足下面条件:设:Lengthparent 为整个字符串的长度, LengthChild为重复串的长度,则 Lengthparent % LengthChild = 0;即 重复串能被父字符串长度整除原创 2016-02-19 22:41:50 · 395 阅读 · 0 评论 -
求N的阶乘
void Factorial(int n){ //假设n最大为1000, 1000的阶乘约等于4 * (10 的2567次方),可以用一个长度为3000的数组保存 const unsigned int MAX_COUNT = 3000; /* 存放阶乘结果,按数组索引递增存放阶乘结果(个、十、百、千... => f[0],f[1],f[2],f[3]...), 之所以采用逆序结果是为原创 2016-02-20 10:09:39 · 1008 阅读 · 0 评论 -
堆排序
最小堆为降序排列,最大堆为升序排列#include <iostream>using namespace std;void MinHeapify(int* A, int parentIndex, int heapSize);void Swap(int* A, int lIndex, int rIndex);void BuildMinHeap(int* A, int len);void Heap原创 2016-03-06 11:41:04 · 231 阅读 · 0 评论 -
插入排序
插入排序思想:数组分为两部分,已排好序的和待排序的部分。每次从待排序部分取一个元素插入到已经排好序的部分,知道整个数组有序。 时间复杂度:0(n^2); 稳定性:稳定。#include <iostream>using namespace std;void InsertSort (int * A, int length);int main (){ int arr[] = {3,1,5原创 2016-03-06 10:49:22 · 257 阅读 · 0 评论 -
分治法——归并排序
分治法:将原问题划分成n个规模较小而结构与原问题相似的子问题,递归的解决这些子问题,然后再合并其结果,就得到原问题的解。 步骤:分解-》解决-》合并。 归并排序算法分析: 这里我们有一个长度为8的数组,元素为{3,1,5,2,4,99,88,7}; 1、分解,把原数组划分成n个相似的子问题,划分结果如图所示: 2、解决子问题:对每个小的数组进行合并,即(原创 2016-03-06 10:33:06 · 440 阅读 · 0 评论 -
桶排序
思想:把元素均匀分成组,然后用一种排序算法对每组元素排序进行排序,最后把所有组中的元素依次加入到原数组中。void BucketSort(int* A, int length){ if (A == NULL || length < 1) { return; } //找到左、右临界值 int min = A[0]; int max = A原创 2016-03-07 08:26:58 · 232 阅读 · 0 评论 -
二叉排序树(BST)
二叉排序树又名二叉搜索树,其任何一个结点的左子树的所有点的值小于父结点,任何一个结点的右子树的所有点的值大于父结点。之所以叫二叉排序树是因为中序遍历输出的结果是一个递增序列。插入: 每次插入新结点,必须从根结点开始遍历,然后把新结点作为叶结点插入。查找: 从根结点开始,如果该结点的值小于所查值,在右子树中查找,否则在左子树中查找删除:前提:删除结点,二叉搜索树的性质不变,保证删除后二叉搜索树的原创 2015-12-14 21:42:15 · 599 阅读 · 1 评论