![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构和算法
IT_LOVER_
这个作者很懒,什么都没留下…
展开
-
二叉排序树的插入和删除
二叉排序树:又称“二叉查找树”,“二叉搜索树”。 二叉排序树是一颗空树,或者具有以下性质: 1. 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值.2.若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值.3.它的左、右子树也分别为二叉排序树。//二叉排序树结构 typedef int ElemType;typedef struct BstNode { Elem原创 2016-05-08 22:47:25 · 2152 阅读 · 0 评论 -
八大排序--堆排序
堆排序: 利用大顶堆(小顶堆)堆顶记录的是最大关键字(最小关键字)这一特性,使得每次从无序中选择最大记录(最小记录)变得简单。 其基本思想为(大顶堆): 1)将初始待排序关键字序列(R1,R2….Rn)构建成大顶堆,此堆为初始的无须区; 2)将堆顶元素R[1]与最后一个元素R[n]交换,此时得到新的无序区(R1,R2,……Rn-1)和新的有序区(Rn),且满足R原创 2016-10-15 13:17:16 · 403 阅读 · 0 评论 -
八大排序--快速排序
快速排序: 1.从序列中选取一个基准,我一般选0号元素。 2.重新排序序列,使比基准小的元素放在其前面,比基准大的元素放在其后面,这就是一个分区操作。 3.递归把小于基准的子序列和大于基准的子序列排序,直到序列剩一个或没有元素。实现代码:int partition(int *arr, int frist, int last){ int i = frist; int j = l原创 2016-10-15 13:03:13 · 317 阅读 · 0 评论 -
输出所有的最长公共子序列
问题描述:给定两个序列,例如 X = “ABCBDAB”、Y = “BDCABA”,求它们的最长公共子序列的长度。下面是求解时的动态规划表,可以看出 X 和 Y 的最长公共子序列的长度为4:输出一个最长公共子序列并不难(网上很多相关代码),难点在于输出所有的最长公共子序列,因为 LCS 通常不唯一。总之,我们需要在动态规划表上进行回溯 —— 从table[m][n],即右下角的格子,开始进行判断:如转载 2017-06-12 12:18:55 · 685 阅读 · 0 评论 -
八大排序比较总结
稳定性: 排序算法的稳定性:若待排序的序列中,存在多个具有相同关键字的记录,经过排序, 这些记录的相对次序保持不变,则称该算法是稳定的;若经排序后,记录的相对 次序发生了改变,则称该算法是不稳定的。 稳定性的好处:排序算法如果是稳定的,那么从一个键上排序,然后再从另一个键上排序,第一个键排序的结果可以为第二个键排序所用。基数排序就是这样,先按低位排序,逐次按高位排序,低位相同的元素其转载 2016-10-15 13:36:57 · 755 阅读 · 0 评论 -
八大排序--基数排序
基数排序: 将整形10进制按每位拆分,然后从低位到高位依次比较各个位。每次比较完进行排序,直到整个数组有序 主要分为两个过程: (1)分配,先从个位开始,根据位值(0-9)分别放到0~9号桶中(比如53,个位为3,则放入3号桶中) (2)收集,再将放置在0~9号桶中的数据按顺序放到数组中 重复(1)(2)过程,从个位到最高位,直到排好序为止(比如32位无符号整形最大数4294967296,原创 2016-10-15 13:23:55 · 370 阅读 · 0 评论 -
八大排序--选择排序
选择排序: 从待排序的序列中选取元素最小的,记录其下标并和序列中为排序的序列开始元素交换,N个元素进行N-1次即可。实现:void select_sort(int *arr, int len){ assert(arr != NULL && len > 0); int min; int index = 0; for(int i = 0; i < len-1; ++i)原创 2016-10-15 13:09:54 · 300 阅读 · 0 评论 -
八大排序--归并排序
归并排序:1.申请空间, 使其大小为两个已经排序的序列之和, 用来存放合并后的序列。 2.设定两个指针指向两序列的开始。 3.比较两个指针所指的元素,选择小的放的合并空间,移动指针。 4.重复3直到某个指针到达序列尾。 5.将剩余的元素拷到合并空间。实现代码:void merge_sort(int *arr, int frist, int mid, int last, int *brr){原创 2016-10-15 12:52:37 · 362 阅读 · 0 评论 -
八大排序--冒泡排序
冒泡排序:相邻的两个元素进行比较,若从小到大排序,每趟循环后,最大的元素到了最后,n个元素经过n-1次后即可。实现代码:void bubble_sort(int *arr, int len){ assert(arr != NULL && len > 0); int count = 0; for(int i = 0; i < len - 1; ++i) {原创 2016-10-15 12:42:05 · 309 阅读 · 0 评论 -
八大排序--希尔排序
希尔排序:将待排序的序列分成若干个子序列,每个子序列采用直接插入排序,整个序列基本有序后,整体再来一次插入排序。这是由于插入排序在元素基本有序时,效率较高。 实现代码:void shell_sort(int a[], int n) { int j, gap; for (gap = n / 2; gap > 0; gap /= 2) { for原创 2016-10-15 12:35:08 · 346 阅读 · 0 评论 -
八大排序--插入排序
插入排序算法: 将第一个数据看作是有序的,第二个到最后一个看成无序; 从头到尾开始扫描未排序数据,将未排序数据插入到相应有序位置的合适位置即可。实现:void insert_sort(int *arr, int len){ assert(arr != NULL && len > 0); int j = 0; int k = 0; int tmp; for(原创 2016-10-15 11:38:37 · 375 阅读 · 0 评论 -
模板实现单链表
今天刚学了模板, 用模板写了个单链表, 不知道还有什么改进的地方,望大神们给点建议。template<typename T>class CLink{public: CLink() { mpHead = new CNode(); } ~CLink() { while(!empty()) {原创 2016-06-10 22:48:07 · 410 阅读 · 0 评论 -
分治法和动态规划求解最长公共子串
一、动态规划动态规划(Dynamic Programming)是一种设计的技巧,是解决多阶段决策过程最优化问题的通用方法。基本思想:将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解(这部分与分治法相似)。与分治法不同的是,适合于用动态规划求解的问题,经分解得到的子问题往往不是互相独立的。若用分治法来解这类问题,则分解得到的子问题数目太多,有些子问题被重复计算了很多次。转载 2017-08-11 19:41:13 · 1491 阅读 · 1 评论