![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
细水长流-青山
成功与失败皆取决于思想的力量。
展开
-
十大基础排序 · 六 --- 堆排序(不稳定)
1. 分析/*6. 堆排序(HeapSort)#时间复杂度: O(nlogn);空间复杂度:O(1)适用场合:在n个元素里找前几个最大的或最小的,我们用堆,并且找大的用小堆,找小的用大堆。#分析: 1. 建堆(此例子 大根堆) 1.1 找到最后一个父亲节点,从最后一个父亲结点操作到第一个父亲节点(n/2-1 ~ 0) 调整过程:原创 2017-07-22 16:27:54 · 2113 阅读 · 0 评论 -
查找算法系列(三):字典查找
我是小脆皮, 今天写一个字典树的博文~~~字典树,就是26叉树。因为26个英文字母所以26个叉! 介绍完了。。。我也惊讶与我的辞藻这么不华丽。。。。 二叉树我们都知道, 不知道的狠狠的撞向豆腐~ 字典树不过就多了几个叉!他的数据结构定义如下:typedef struct node{ int nFlag; //标记到此是否有单词 char* pStr; //如果nFla原创 2017-08-09 10:41:51 · 3062 阅读 · 1 评论 -
查找算法系列(一):二分查找( 描述+代码)
1.分析1. 需要三个变量 1. nLow 2. nMid 3. nHigh2. 过程设待查数据为nFind, 数组为arr 如果 nFind > arr[nMid] nLow = nMid + 1; 否则 nHigh = nMid - 1;3. 时间复杂度: O(nlog^n)#include<stdio.h>原创 2017-07-23 10:02:38 · 596 阅读 · 1 评论 -
游戏地图寻路算法 -- A*(分析 + 实现 + 教学视频连接)
首先理解游戏地图怎么设定那里不让走那里让走: 把图片分成一块一块格子,标记各个格子是否能走;介绍一下A* A*的核心就是 : 一个评估函数 F = G + H + 2个表假设 从A点到B点: F = G + H: - F: 从A到B的最短路径长度; - G: 从起点,沿着产生的路径, 移动到指定点的耗费; - H: 预估值,估计从A到B多长原创 2017-07-22 17:20:37 · 5434 阅读 · 0 评论 -
图的最短路径:Dijkstra、Bellman-Ford、SPFA、Floyd、A*算法汇总
图的表示方法最常用的表示图的方法是邻接矩阵与邻接表。邻接矩阵表示法设G是一个有n(n>0)个顶点的图,V(G)={v1, v2, …, vn},则邻接矩阵AG是一个n阶二维矩阵。在该矩阵中,如果vi至vj有一条边,则(i, j)项的值为1,否则为0,即: 邻接矩阵的实现很简单:int edge[n][n]={0};for(...){ ... //无向图的邻接矩阵表示 e转载 2017-07-24 16:32:17 · 7098 阅读 · 0 评论 -
链表的快速排序 - 区间分割法
首先,回忆一下数组的快排步骤:函数参数: 数组arr, 起点nLow, 终点nHigh 功能: 把nLow 至 nHigh 段的数组进行一次快排。 结果:【比nMark小的元素】nMark【比nMark大的元素】#区间分割法 1. 取最后一个元素为标记,用nSmall标记小区间大小,i 用来遍历数组; 2. 遍历值小于标记值:小区间的下一个不是当前位置,需要交换原创 2017-08-08 15:25:30 · 521 阅读 · 0 评论 -
十大基础排序 · 四 --- 快速排序(不稳定)挖坑填补法+区间分割法+3种优化方法
1. 分析/*4. 快速排序(QuickSort)#平均时间复杂度: O(nlogn) #最坏时间复杂度:O(n2) (有序的情况)#空间复杂度:需要一个栈空间, 若每趟排序将记录均匀分割成两个相近的子序列,则栈的最大深度为 向下取整[logn]+1; 若偏向一边, 最坏情况,栈最大深度为n; 在一趟分割后比较分割后的长度,先对短序列排序,则栈最大深度为O(logn);原创 2017-07-22 16:33:10 · 1276 阅读 · 1 评论 -
分治算法(概念、特性、步骤、复杂度分析、经典例子)
一、基本概念在计算机科学中,分治法是一种很重要的算法。分治算法,字面上的解释是“分而治之”,分治算法主要是三点:1.将一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题—-“分”2.将最后子问题可以简单的直接求解—-“治”3.将所有子问题的解合并起来就是原问题打得解—-“合”这三点是分治算法的主要特点,只要是符合这三个特点的问题都可以使用分治算法进行解决(注意用词,是”用”原创 2017-07-22 15:59:24 · 18294 阅读 · 0 评论 -
十大基础排序 · 十 --- 基数排序(稳定)
1. 分析/*10.基数排序(RadixSort)#分析: 1. 分桶: 按照个位分桶 2. 把数据装入对应桶中;(尾添加) 3. 把数据倒回原数组 4. 再按照 十位分桶,重复2-3 5. 再按照 百位分桶,从复2-3 6. 直到最高位。例子: 原数组:23,653,121,53,110,15,482,663,35,336,57,3原创 2017-07-22 16:14:52 · 2231 阅读 · 0 评论 -
十大基础排序 · 七 --- 2-路归并(稳定)
1. 分析/*7. 2路-归并排序(MergeSort)#时间复杂度: O(nlogn);空间复杂度:O(n)//实现归并排序需和待排记录等数量的辅助空间;#分析: 1. 先分解左边,再分解右边 2. 左右两个分解完毕,直到小组仅有一个元素,返回 3. 返回上一级调用处(此时小组中是有2个元素的) 4. 执行Merge#特点: 稳定#实现方法:递归*/原创 2017-07-22 16:24:51 · 473 阅读 · 0 评论 -
十大基础排序 · 五 --- 选择排序(不稳定)
1. 分析/*5. 选择排序(SelectSort)#时间复杂度: O(n^2) 空间复杂度:O(1)#分析: 每次选择最小的数字, 放到位置上, 再在剩下的数中选择处最小的数字实现方法:2个for循环*/2.源码void SelectSort(int arr[], int nLength){ if(arr == NULL ||nLength <=0) {原创 2017-07-22 16:30:42 · 509 阅读 · 0 评论 -
十大基础排序 · 三 --- 冒泡排序(稳定 ,常规写法)
1. 分析/*3. #时间复杂度: O(n^2)#最好时间复杂度: O(n) 有序情况#适用场合: 冒泡排序对有序序列排序最快;#思想:两两比较,大的放后边;(每趟能确定一个元素位置)#分析: 两层循环:外层for 控制遍历次数,内层循环控制元素遍历; 由于每趟都确定了一个元素,所以每次遍历的元素个数减少1;优化: 1.使得其对有序数组 遍历一次就确定是原创 2017-07-22 16:35:11 · 450 阅读 · 0 评论 -
十大基础排序 · 二 --- 希尔排序(不稳定)
1. 分析/*2. 希尔排序(ShellSort)#希尔排序的时间复杂度 较直接插入排序低,它的时间是所取“增量”序列的函数。 最好时间复杂度: O(n) 平均时间复杂度: O(1.2^n ~ 1.5^n) 最坏时间复杂度: O(n^2)#空间复杂度:O(1) #基本思想: 先将整个待排记录序列分割成为若干子序列分别进行直接插入排序, 待整个序列中原创 2017-07-22 16:39:11 · 2679 阅读 · 1 评论 -
十大基础排序 · 一 --- 直接插入排序(稳定)
1. 分析/*1. 直接插入排序(InsertSort)#时间复杂度: 最好时间复杂度:O(n) 平均时间复杂度:O(n^2) 最坏时间复杂度:O(n^2)#空间复杂度:O(1)#应用场合:1.元素特别少;2.数组基本有序;#分析: 1. 带排序 数组分成两部分 2. 将无序数组的元素依次插入到有序数组中去 2.1 保存无序的第一个原创 2017-07-22 16:41:35 · 483 阅读 · 0 评论 -
查找算法系列(二):哈希查找
1. 介绍哈希函数的构建2. 哈希冲突的解决方法3. 源码分享: 直接地址法 + 拉链法原创 2017-07-23 10:46:19 · 475 阅读 · 1 评论 -
十大基础排序 · 八 --- 计数排序
我也来写一篇排序的博客吧,看这个算法的有些博文推荐靠前但是写的有点乱,把自己的代码分享出来,让读者有更多的选择和思考; 虽然是个简单的小程序,若有更好的实现方法,欢迎交流探讨。 1. 简介 计数排序(CountSort) 时间复杂度: O(n) 空间复杂度:O(k) 适用场合: 数字在一定范围内,且分布密集或重复次数高; 分析: 1. 找到数组的最大最小值!(数字范围原创 2017-06-24 09:57:15 · 289 阅读 · 0 评论 -
十大基础排序 · 九 --- 桶排序(不稳定)
1. 分析/*9.桶排序(BucketSort)#分析: 1. 分桶: 按照最高位分桶,最高位相同按照次高位分桶 2. 把数据装入对应桶中;(头添加) 3. 桶内数据排序 4. 把数据倒回原数组例子: 原数组:123,653,121,453,110,145,487,663,235,336,571 桶: 1, 2,3,4,5,6 桶1:1原创 2017-07-22 16:21:13 · 2017 阅读 · 0 评论 -
大小端存储模式的几个问题
1. 为什么大小端能够并存至今?答:历史惯性各有优势大端优点:符号位在所表示的数据的内容的第一个字节中,便于快速判断数据的正负和大小。 小端优点:低地址放低字节,所以在强制转换时不需要调整字节的内容。CPU做数值运算时从内存中依次从低到高取数据进行运算直到最后刷新最高位的符号位,这样运算方式会更高效。2. 发展现状Interl x86系列芯片使用...原创 2018-04-23 12:49:32 · 1367 阅读 · 0 评论