![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
先锋小牛
这个作者很懒,什么都没留下…
展开
-
排序算法之冒泡排序
简述 冒泡排序就是把小的元素往前调(或者把大的元素往后调)。注意是相邻的两个元素进行比较,而且是否需要交换也发生在这两个元素之间。所以,如果两个元素相等,我想你是不会再无聊地把它们俩再交换一下。如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个元素相邻起来,最终也不会交换它俩的位置,所以相同元素经过排序后顺序并没有改变。所以冒泡排序是一种稳定排序算法。实现v原创 2017-05-29 15:34:39 · 202 阅读 · 0 评论 -
数据结构之链表 (C++类模板实现)
简述前面用c写的链表主要使用泛型指针(void *)存储数据的地址,索引到不同类型的数据,而用C++类模板实现后可以直接存储数据,编译器会根据定义好的数据类型动态分配空间。原创 2017-05-29 22:50:13 · 996 阅读 · 0 评论 -
数据结构之单向链表
概述 线性结构是一种最简单且常用的数据结构。线性结构的基本特点是节点之间满足线性关系。本章讨论的动态数组、链表、栈、队列都属于线性结构。他们的共同之处,是节点中有且只有一个开始节点和终端节点。按这种关系,可以把它们的所有节点排列成一个线性序列。但是,他们分别属于几种不同的抽象数据类型实现,它们之间的区别,主要就是操作的不同。线性表是零个或者多个数据元素的有限序列,数据元素之间是有顺序的,原创 2017-05-29 20:26:24 · 249 阅读 · 0 评论 -
数据结构之动态数组
简述 动态数组类似普通数组,内存空间都是连续的,可根据下标访问元素,普通数组定义时就会分配好空间,内存大小固定不变了,无法扩容,数据容易越界,但动态内存的大小会随着数据的增长而扩容。 动态数组看似内存空间在原来的基础上增长了,其实它只是申请了一块更大的内存,并把旧内存空间的数据拷贝到新申请的内存空间中,再把旧的空间释放掉,就这样一旦 发现当前内存快满,就会申请一块新的,同理,当原创 2017-05-29 21:12:12 · 690 阅读 · 0 评论 -
数据结构之栈
简述 栈是线性表的一种,他遵循先进后出的特性,其实就是封装一下,提供一些符合先进后出特性的方法,我这里用了三种方式实现了。实现一,第一种是顺序栈,就是以数组为基础实现的栈SeqStack.h#pragma once#define MAX 1024#include#include#includetypedef struct _SeqStack{ voi原创 2017-05-29 21:50:24 · 300 阅读 · 0 评论 -
数据结构之队列
简述 队列实现与栈类似,队列遵循先进先出,就跟买票一样排在前面的先买好出对,也用了三种方式实现它。原创 2017-05-29 22:19:57 · 272 阅读 · 0 评论 -
数据结构之双向链表
简述 双向链表中每个节点的指针域都有两个指针,一个指向上一个节点,一个指向下一个节点,较单项链表指针域有一个指针而言,占用资源更大,但相应的双向链表遍历的时候只需要一个指针就可以,而且只有得到其中任何一个节点就是得到整个链表,单向链表必须得到他的头节点,才能遍历整个链表,而且得有两个指针。实现BothwayLinkList.h#ifndef MYMODULE_H原创 2017-05-29 20:46:15 · 245 阅读 · 0 评论 -
数据结构之总述
数据结构的概念数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。原创 2017-05-29 19:47:39 · 281 阅读 · 0 评论 -
排序算法之插入排序
简述插入排序是在一个已经有序的小序列的基础上,一次插入一个元素。当然,刚开始这个有序的小序列只有1个元素,也就是第一个元素(默认它有序)。比较是从有序序列的末尾开始,也就是把待插入的元素和已经有序的最大者开始比起,如果比它大则直接插入在其后面。否则一直往前找直到找到它该插入的位置。如果遇见一个与插入元素相等的,那么把待插入的元素放在相等元素的后面。所以,相等元素的前后顺序没有改原创 2017-05-29 15:50:20 · 193 阅读 · 0 评论 -
排序算法之快速排序
简述 快速排序有两个方向,左边的i下标一直往右走(当条件a[i] 而右边的j下标一直往左走(当a[j] > a[center_index]时)。如果i和j都走不动了,i j。交换a[j]和a[center_index],完成一趟快速排序。在中枢元素和a[j]交换的时候,很有可能把前面的元素的稳定性打乱,比如序列为 5 3 3 4 3 8 9 10 11现在中枢元素原创 2017-05-29 15:57:54 · 174 阅读 · 0 评论 -
排序算法之希尔排序
简述 希尔排序是按照不同步长对元素进行插入排序,当刚开始元素很无序的时候,步长最大,所以插入排序的元素个数很少,速度很快;当元素基本有序时,步长很小,插入排序对于有序的序列效率很高。所以,希尔排序的时间复杂度会比O(N^2)好一些。由于多次插入排序,我们知道一次插入排序是稳定的,不会改变相同元素的相对顺序,但在不同的插入排序过程中,相同的元素可能在各自的插入排序中移动,最后其稳定性就原创 2017-05-29 16:00:02 · 203 阅读 · 0 评论 -
排序算法之归并排序
简述归并排序是把序列递归地分成短序列,递归出口是短序列只有1个元素(认为直接有序)或者2个序列(1次比较和交换),然后把各个有序的段序列合并成一个有序的长序列,不断合并直到原序列全部排好序。可以发现,在1个或2个元素时,1个元素不会交换,2个元素如果大小相等也没有人故意交换,这不会破坏稳定性。那么,在短的有序序列合并的过程中,稳定是是否受到破坏?没有,合并过程中我们可以保证如果两个当前元素原创 2017-05-29 16:04:33 · 240 阅读 · 0 评论 -
排序算法之堆排序
简述 堆的结构是节点i的孩子为2*i和2*i+1节点,大顶堆要求父节点大于等于其2个子节点,小顶堆要求父节点小于等于其2个子节点。在一个长为n的序列,堆排序的过程是从第n/2开始和其子节点共3个值选择最大(大顶堆)或者最小(小顶堆),这3个元素之间的择当然不会破坏稳定性。但当为n/2-1, n/2-2, ...1这些个父节点选择元素时,就会破坏稳定性。有可能第n/2个父节点交换原创 2017-05-29 16:10:44 · 215 阅读 · 0 评论 -
排序算法之选择排序
简述 选择排序即是给每个位置选择待排序元素中当前最小的元素。比如给第一个位置选择最小的,在剩余元素里面给第二个位置选择次小的,依次类推,直到第n-1个元素,第n个元素不用选择了,因为只剩下它一个最大的元素了。那么,在一趟选择时,如果当前锁定元素比后面一个元素大,而后面较小的那个元素又出现在一个与当前锁定元素相等的元素后面,那么交换后位置顺序显然改变了。呵呵!比较拗口,举个原创 2017-05-29 15:53:44 · 191 阅读 · 0 评论 -
排序算法之总述
说起排序算法我第一时间想到了冒泡排序,这是我写过的第一个排序算法,也是最基本的一个算法,但他的处理效率不是很高,美国总统奥巴马都知道对于100万个量级的数据他是处理不了的。不过排序算法可不只冒泡排序一种,下面简单看看其他的吧。原创 2017-05-29 15:04:12 · 239 阅读 · 0 评论 -
数据结构之动态数组 (C++类模板实现)
简述前面用c写的动态数组主要使用泛型指针(void *)存储数据的地址,索引到不同类型的数据,而用C++类模板实现后可以直接存储数据,编译器会根据定义好的数据类型自动态分配空间。原创 2017-05-29 22:48:13 · 3972 阅读 · 0 评论