随笔分类 - 数据结构和算法
摘要:在体验了"选择排序"和"插入排序",本篇体验的是"冒泡排序",依次遍历数组中的元素,按照升序排列,如果前一个位置元素比后一个位置元素大,两者就交换位置。 自定义一个处理整型数组的类,包含添加、显示、清除及冒泡方法以及获取数组长度的属性。 class MyIntArray { private int[] arr; private int upper; ...
阅读全文
摘要:与链表、堆栈和队列不一样,二叉查找树不是线性数据结构,是二维数据结构。每个节点都包含一个LeftNode和RightNode,二叉查找树把比节点数据项小的数据放在LeftNode,把比节点数据项大的数据放在RightNode。 关于节点的类。 public class TreeNode { public T Element { get; set; } pub...
阅读全文
摘要:队列和堆栈都是约束版的链表,就像在超市购物,队列是先进先出的数据结构。 接着上一篇,派生于链表类List,来模拟一个队列。namespace LinkedListLibrary{ public class QueueInheritance : List { public QueueInheritance() : base("queue"){} //入队:到...
阅读全文
摘要:在"了解集合本质必须要知晓的概念-链表"中,我们了解了链表的概念和种类,并且模拟了一个单向链表。本篇体验的堆栈是约束版的链表,只能在栈顶接收新节点和释放节点。 堆栈的主要操作是压栈和出栈。压栈是将新节点放在栈顶,出栈是从栈顶取出一个节点,返回新弹出节点的数据项。堆栈也称为后进先出的数据结构。 接着上一篇,写一个派生于List的类来模拟堆栈的压栈和出栈。namespace LinkedListL...
阅读全文
摘要:如果想对集合(系列)有本质的了解,链表是一个必须了解的概念。本篇主要包括: ● 链表的由来和定义● 创建一个单向链表● 其它链表 链表的由来和定义 在现实生活中,我们把不同的商品放在一个购物车中。而在面向对象的世界里,有时候,也需要把不同类型的数据放到一起,组成一个集合。集合中的元素并不是彼此孤立的,在C#中,如何表达集合元素间的关系呢? 借助"自引用类"可以确立集合元素间的关系。比如有这样...
阅读全文
摘要:在选择排序中,从第一个元素开始,依次遍历数组中的元素,找出当前遍历元素之后的最小元素,与当前遍历元素交换位置,依此类推,是一种由前往后的排序。而在插入排序中,从第二个元素开始,依次遍历数组中的元素,把当前遍历元素与之前的元素进行比较,并插入到之前的某个位置,是一种由后往前的排序。 自定义一个类,里面维护着一个int[]类型数组,通过构造函数定义数组长度并初始化,并提供了打印和插入排序的相关方法...
阅读全文
摘要:选择排序是一种低效的排序算法,大致过程是:遍历数组的每一个元素,先假设0号位置上的元素是最小的,并把0号索引赋值给一个表示最小元素索引的变量,比如说是smallest,再遍历0号位置以后的元素,一旦发现有比0号位置元素更小的元素,就把该元素的索引赋值给smallest,继续遍历,最终把0号位置以后最小元素的索引赋值给了smallest变量,再把0号位置和smallest位置上的元素互换,这样,在0...
阅读全文
摘要:折半查找,也叫二分查找,当在一个数组或集合中查找某个元素时,先定位出中间位置元素,如果要查找的元素正好和该中间位置元素相等,通过一次查找,就能找到匹配元素;如果要查找的元素小于该中间位置元素,就抛弃后面一半的元素,在前面一半的元素中再定位出中间位置元素,如此反复,直到找到匹配元素;如果要查找的元素大于该中间位置元素,就抛弃前面一半的元素,在后面一半的元素中定位出中间位置元素,如此反复。 面临的...
阅读全文
摘要:线性查找,肯定是以线性的方式,在集合或数组中查找某个元素。本篇包括: 通过代码来理解线性查找 时间复杂度 什么是算法 通过代码来理解线性查找 什么叫"线性"?还是在代码中体会吧。 首先需要一个集合或数组,如何得到呢?就生成一个固定长度的随机数组吧。然后输入一个查找key,如果找到就返回元素的索引,没找到就返回-1,就这么简单。 class Program { ...
阅读全文
摘要:实现洗牌游戏的一种算法是:遍历每个位置上的牌,然后与随机位置上的牌交换。 对于牌来讲,2个关键的因素是面值和类型(红桃、梅花等)。 public class Card { private string mianzhi; private string leixin; public Card(string m, string l) ...
阅读全文
摘要:递归的一个典型应用就是遍历目标文件夹,把该文件夹下的所有文件和文件夹打印或显示出来,还可以递归计算目标文件夹的总大小。 1: class Program 2: { 3: static void Main(string[] args) 4: { 5: Console.WriteLine("输入目标文件夹"); 6: ...
阅读全文
摘要:如果想实现一个阶乘,比如6 * 5 * 4 * 3 * 2 * 1,首先想到的可能是循环遍历。如下: class Program { static void Main(string[] args) { Console.WriteLine("请输入一个数"); int number = Convert.ToInt3...
阅读全文