基本数据结构与算法
基本数据结构与算法
KingOfMyHeart
会好起来的.
展开
-
选择排序之简单选择排序
简介基本思想:在待排序数据中,选择最大或者最小的元素放在其最终位置基本操作:实例:从序列中选择一个出一个最小的元素,然后将最小元素与第一个位置元素交换位置8的位置确定后,不需要做调整了,然后在剩下的序列中,找到第二小的元素,放在第二个位置:16的位置也不需要做调整了,然后在剩下的序列重复找第三小,第四小…最终排序完成,整个过程就是选择第n小的元素,放在第n号下标中。代码:void SelectSort(int array[], int length){ int min;原创 2021-05-23 17:03:50 · 122 阅读 · 0 评论 -
交换排序之快速排序
特点选取一个中心或者基准,一般选择第一个。然后将比基准大的元素搬到后面,比基准小的元素搬在后面,此时基准左边的元素(左子表)都小于基准,右边的元素(右子表)都大于基准。然后将左子表继续按照上述步骤进行操作,选取新基准,小的在前,大的放后。右边的序列相同。直到序列的长度为1时,结束操作。整个过程是一个递归的思想,递归结束条件是子序列长度为1。基本思想:通过一趟排序,将排序记录分割成独立的两部分,其中一部分记录的比另一部分关键字小,则可对这两部分记录进行排序,以达到整个序列有序。具原创 2021-05-23 16:15:56 · 233 阅读 · 0 评论 -
交换排序之冒泡排序
特点挨个比较,如果发生逆序,就交换两个元素的位置。实例代码void print(int *arr,int length){ for(int i =0;i<length;++i){ std::cout<<arr[i]<<" "; } std::cout<<std::endl;}void BubbleSort(int *arr,int length){ int i,j; for(i = 0;原创 2021-05-22 21:31:15 · 125 阅读 · 0 评论 -
插入排序之希尔排序
特点基本思想:将整个待排序列分割成若干子序列,分别进行直接插入排序,待整个序列中记录“基本有序”时,再对全体记录进行一次直接插入排序。首先定义增量序列,如 下图,5,3,1,增量是递减的,并且最终一定要做一次增量为1的插入排序增量为5:对于间隔为5构成的序列进行插入排序增量为3:对于间隔为3构成的序列进行插入排序增量为1:对整体进行直接插入排序且增量与增量之间应互为质数。实例增量(间隔)为5时,分成5个子序列:分别是{81,35,41},{94,17,75},{11,95,15},{原创 2021-05-22 20:46:51 · 964 阅读 · 2 评论 -
插入排序之折半插入排序
特点折半插入排序:用二分查找的方法在有序部分找到待排序元素插入的位置,叫做折半插入排序实例代码void BinaryInsertSort(int *arr,int length){ int i; //无序部分第一个元素 int j; //有序部分插入位置下标的前一个位置 int low; int high; int mid; for(i = 2;i<=length;++i){ //初始状态arr[1]是有序的,所以i从2开始比较原创 2021-05-22 17:07:33 · 510 阅读 · 0 评论 -
插入排序之直接插入排序
特点直接插入排序:顺序遍历有序的部分元素去找到待排序元素插入的位置,叫做直接插入排序基本过程:将一个待排序的数组分为2部分,第一部分是arr[1]有序部分,第二部分是arr[1]~arr[length-1]无序部分arr[0]是一般被赋值为待排序元素 ,作为哨兵位每次从无序部分抓取一个元素即arr[i],从后往前或者从前往后与有序部分元素进行比较大小,将该元素插入到合适的位置直到最后无序部分都加入到了有序的队伍里,完成排序.实例每次将arr[0] = arr[i]从后往前移动j,比较ar原创 2021-05-22 16:45:20 · 280 阅读 · 0 评论 -
查找算法之分块查找
基本思路按照表的特点,将表分为几部分或者几块,需要查找元素key时,我们确定好元素在哪个块,然后再去对应的块中进行查找,根据块内数据的特点,再去选择顺序查找还是二分查找。实例将表分为三个部分,第一个部分最大值为22,第二个部分最大值为48,第三个部分最大值为86。然后建立一个索引表,分别记录每块的最大值以及最大值块部分的起始地址。查找时:查找所在块时,可以使用二分查找在快内进行查找时,根据数据有无序,进行二分或者顺序查找...原创 2021-05-22 09:50:01 · 682 阅读 · 0 评论 -
线性表查找之二分查找(折半、对分查找)
特点:前提是对有序的一组元素进行查找每次将待查记录所在区间缩小一半代码:不断的缩小范围:#include <iostream>#include <assert.h>using namespace std;int binary_search(int key,int *arr,int length){ assert(arr != NULL); assert(length > 0); int low = 0; int high原创 2021-05-22 09:27:31 · 626 阅读 · 0 评论 -
关于顺序表查找效率提升的讨论
上一篇文章,顺序表的查找数据元素查找概率不相等时如何提高查找效率对于查找概率比较多的元素(事先知道查找概率),放在靠后的位置,从后向前查找时,更快找到:被查找概率越高,比较次数越少被查找概率越低,比较次数较多事先不知道元素的查找概率空间换时间的思想:元素不光是元素数据本身了,再添加一个域来记录当前数组的访问频度或者访问次数这个过程始终的去保持访问频度较高的在顺序表后,这个过程需要去动态的调整...原创 2021-05-21 22:24:06 · 923 阅读 · 0 评论 -
查找算法之顺序查找以及设置哨兵位进行改良
应用范围顺序表或线性链表表示的静态查找表表内元素之间是无序的顺序表的定义struct Table{ ElemType *arr; //表基址 int size; //表中元素的个数};Table tb;在顺序表tb中查找值为key的元素,size == 11,capaticy == 12,0号元素存放需要查找的key值可以从前往后找:intfind(int key,int *arr,int size){//第一次比较 i<=sizefor(int i =1;i <原创 2021-05-21 22:02:24 · 1613 阅读 · 0 评论 -
二叉树的存储结构顺序存储和链式存储
顺序存储实现:将一棵二叉树按照当做一棵满二叉树进行编号(从上到下,从左到右),编号作为数组的下标,一次存放到二叉树的数据元素。当一个二叉树不是完全二叉树,那么总会有一些位置没有元素,那么就将这些位置空出来。#define CAPACITYtypedef TElemType SqBinaryTree[CAPACITY];SqBinaryTree sb;将下表恢复成一棵二叉树:如图,空着的地方对应没有数据:缺点:浪费储存空间,只有左孩子或者只有右孩子的情况更加明显,更适用于满二叉树或者原创 2021-05-16 14:41:14 · 2768 阅读 · 0 评论 -
二叉树的性质与满二叉树和完全二叉树
性质一:二叉树中,第i层上至多有2^(i-1)个结点(i>=1):至少需要有一个结点,否则就不存在这一层了。性质二:深度为k的二叉树至多有(2^k) -1个结点(k>=1):实际上是等比数列的求和:2^0 + 2^2 + 2^3 + … + 2^k-1 = = (2^K) -1性质三:对于任何一棵二叉树T,如果其叶子结点数为n0,度为2的结点数为n2,那么n0 = n2+1比如满足上图:叶子结点数: 7 8 9 10 11 12度为2结点数:1 2 3 4 5满二叉树:根据原创 2021-05-16 13:49:58 · 1564 阅读 · 0 评论 -
树的基本概念与二叉树的定义
树的概念:根结点:A,即唯一一个没有前驱的节点结点的度:也叫结点的子树的个数,比如A结点的度是3,分别是B C D, C结点的度是1,只有G树的度:所有结点的度的最大值,这里最大为3,A或者D的度最大叶子结点:无后继的结点,也叫终端结点双亲和孩子结点: BCD的双亲是A,A的孩子结点是BCD兄弟结点: 双亲结点相同的节点,如H I J的双亲结点都是D,所以H I J是兄弟结点堂兄弟结点:位于同一层上的节点为堂兄弟结点,比如E F G H I J ,因为他们的双亲结点是在同一层的树的深度:树原创 2021-05-15 21:37:15 · 194 阅读 · 1 评论 -
数据结构与算法之排序方法分类
按照存储介质分内部排序:数据量不大,数据都在内存中,无需内外存进行交换数据外部排序:数据量较大,数据在外存,排序时需要将数据换入换出内存按比较器个数分串行处理:单处理机 同一时刻比较一对元素并行处理:多处理机 同一时刻比较多对元素按主要操作分比较排序:用比较的方法,如插入排序,交换排序,选择排序,归并排序基数排序:不比较元素的大小,仅仅根据元素本身的取值确定其有序的位置按照排序所需辅助空间可分为:原地排序:空间复杂度为O(1),空间复杂度不会随着数据量的增大而增大非原地排序:超过O(1原创 2021-05-07 08:08:39 · 223 阅读 · 0 评论 -
数组、链表、跳表基本特性
一.数组:优点:地址连续,访问任意一项都是常数级别O(1);缺点:删除,增加元素时间复杂度高,需要遍历,一般为O(n),插入前保证数组的size足够;数组size较小,会进行扩容,拷贝等低效的操作。二.链表: LRU cache单链表,双向链表(),循环链表(头尾相连,尾指针指向头指针)优点:灵活,插入不需要扩容、移动其他元素或者拷贝等操作,O(1);缺点:占...原创 2019-11-11 21:49:34 · 918 阅读 · 0 评论