C#算法设计
文章平均质量分 92
本系列博文将会向大家介绍本人在钻研《算法导论 第3版》过程中的点点滴滴,并使用C#语言实现该书中所有的经典算法,附带相应的时间复杂度分析。
无痕的过往
这个作者很懒,什么都没留下…
展开
-
C#算法设计之知识储备
前言算法的讨论具有一定的规则,其中也包含一些不成文的约定,本博文旨在为初学算法的同学指明一条通向算法的“不归路”。渐近记号1、Θ(big-theta)若存在正常量、和,使得当时,不等式恒成立,则称g(n)是f(n)的一个渐近紧确界,记作Θ。它包含渐近上界和渐近下界。简单的理解为在时,f(n)被夹在和之间,为f(n)的渐近下界,为f(n)的渐近上界...原创 2018-09-09 23:45:22 · 14774 阅读 · 0 评论 -
C#算法设计排序篇之01-冒泡排序(附带动画演示程序)
冒泡排序(Bubble Sort)它重复地访问要排序的元素列,一次比较两个相邻的元素,如果他们的顺序不符合预期就把他们交换过来。访问元素的工作是重复地进行直到没有相邻元素需要交换时为止。示例:public class Program { public static void Main(string[] args) { int[] array = { 43...原创 2018-08-05 17:05:07 · 19004 阅读 · 1 评论 -
C#算法设计排序篇之03-直接插入排序(附带动画演示程序)
直接插入排序(Straight Insertion Sort)直接插入排序是一种最简单的排序方法,其基本操作是将一条记录插入到已排好的有序表中,从而得到一个新的、记录数量增1的有序表。示例:public class Program { public static void Main(string[] args) { int[] array = { 43, ...原创 2018-08-08 01:46:48 · 13705 阅读 · 0 评论 -
C#算法设计排序篇之04-选择排序(附带动画演示程序)
选择排序(Selection Sort)选择排序是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法。示例:public class Program { public static void Main(string[] args) { ...原创 2018-08-09 00:22:32 · 13035 阅读 · 0 评论 -
C#算法设计排序篇之05-归并排序(附带动画演示程序)
归并排序(Merge Sort)归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。示例:public class Program { public static vo...原创 2018-08-09 17:03:26 · 21337 阅读 · 0 评论 -
C#算法设计排序篇之07-希尔排序(附带动画演示程序)
希尔排序(Shell's Sort)希尔排序是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法把数组按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个数组恰被分成一组,算法终止。示例:public ...原创 2018-08-12 14:11:29 · 13060 阅读 · 0 评论 -
C#算法设计排序篇之08-计数排序(附带动画演示程序)
计数排序(Counting Sort)计数排序是一个非基于比较的排序算法,该算法于1954年由 Harold H. Seward 提出。它的优势在于在对一定范围内的整数排序时,它的时间复杂度为线性的O(n+k)(其中k是整数的范围,即max - min + 1),快于任何比较排序算法,这是一种典型的空间换时间的算法。示例:public class Program { pu...原创 2018-08-13 01:54:03 · 14232 阅读 · 5 评论 -
C#算法设计排序篇之09-基数排序(附带动画演示程序)
基数排序(Radix Sort)基数排序属于“分配式排序”(Distribution Sort),它是透过键值的部份信息,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为 ,其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的稳定性排序法。示例:public class Program { publi...原创 2018-08-13 17:20:47 · 12848 阅读 · 2 评论 -
C#算法设计排序篇之11-二叉树排序(附带动画演示程序)
二叉树排序(Binary Tree Sort)二叉树排序是构建在二叉排序树(Binary Sort Tree)上的算法,二叉排序树或者是一棵空树,或者是具有下列性质的二叉树:若左子树不空,则左子树上所有结点的值均小于或等于它的根结点的值; 若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值; 左、右子树也分别为二叉排序树。二叉树排序需要先生成一个二叉排序树,再使用中序遍历...原创 2018-08-14 00:40:33 · 13988 阅读 · 3 评论 -
C#算法设计排序篇之10-桶排序(附带动画演示程序)
桶排序(Bucket Sort)桶排序的工作原理是将数组根据一定的策略均匀的分到有限数量的桶子里,再对每个桶里的内容进行排序。桶排序是鸽巢排序的一种归纳结果,当要被排序的数组内的数值是均匀分配的时候,桶排序使用线性时间 。桶排序并不是比较排序,它不受到的下限的影响。示例:public class Program { public static void Main(s...原创 2018-08-16 00:18:05 · 18032 阅读 · 0 评论 -
C#经典算法实践,回顾往生,更是致敬《算法导论》
概述 本系列博文将会向大家介绍本人在钻研《算法导论 第3版》过程中的点点滴滴,并使用C#语言实现该书中所有的经典算法,附带相应的时间复杂度分析。知识储备 C#算法设计之知识储备C#算法设计排序篇 C#算法设计排序篇之前言 C#算法设计排序篇之01-冒泡排序(附带动画演示程序)C#算法设计排序篇之02-快速排序(附带动画演示程序)...原创 2018-08-05 17:05:22 · 18330 阅读 · 2 评论 -
C#算法设计排序篇之02-快速排序(附带动画演示程序)
快速排序(QuickSort)快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。示例:public class Program { public st...原创 2018-08-07 17:41:15 · 15085 阅读 · 0 评论 -
C#算法设计查找篇之02-二分查找
二分查找(Binary Search)二分查找也称折半查找,它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。 首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。...原创 2018-08-20 00:30:47 · 15996 阅读 · 0 评论 -
C#算法设计排序篇之06-堆排序(附带动画演示程序)
堆排序(Heap Sort)堆排序是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。可以利用数组的特点快速定位指定索引的元素。堆分为大根堆和小根堆,是完全二叉树。大根堆的要求是每个节点的值都不大于其父节点的值,即A[PARENT[i]] >= A[i]。在数组的升序排序中,需要使用的就是大根堆,因为根据大根堆的要求可知,最大的值一定在堆顶。示例:pub...原创 2018-08-11 01:33:50 · 13678 阅读 · 2 评论 -
C#算法设计查找篇之01-顺序查找
顺序查找(Sequential Search)顺序查找也称线性搜索(Linear Search),是在一个已知无(或有序)序队列中找出与给定关键字相同的值的具体位置。原理是让关键字与队列中的第1个(或最后1个)位置的值逐个比较,直到找出与给定关键字相同的值为止,它的缺点是效率低下。示例:public class Program { public static void M...原创 2018-08-20 00:09:21 · 13478 阅读 · 0 评论 -
C#算法设计查找篇之03-插值查找
插值查找(InterpolationSearch)插值查找是二分查找的更高效版本,它不会每次按2平分原问题规模,而是应用一个技巧来尽快的接近目标关键字。示例:public class Program { public static void Main(string[] args) { int[] array = { 8, 11, 21, 28, 32, ...原创 2018-08-20 01:31:12 · 14937 阅读 · 0 评论 -
C#算法设计查找篇之04-斐波那契查找
斐波那契查找(FibonacciSearch)斐波那契查找是区间中单峰函数的搜索技术,它在二分查找的基础上根据斐波那契数列进行分割的。在斐波那契数列找一个等于或略大于查找表中元素个数的数F[n],如果原查找表长度不足F[n],则补充重复最后一个元素,直到满足F[n]个元素时为止。完成后进行斐波那契分割,即F[n]个元素分割为前半部分F[n-1]个元素,后半部分F[n-2]个元素,根据值的关系...原创 2018-08-21 01:15:56 · 15085 阅读 · 0 评论 -
C#算法设计查找篇之05-二叉树查找
二叉树查找(Binary Tree Search)二叉排序树或者是一棵空树,或者是具有下列性质的二叉树:若左子树不空,则左子树上所有结点的值均小于或等于它的根结点的值; 若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值; 左、右子树也分别为二叉排序树。二叉树查找需要先生成一个二叉排序树,再遍历所有节点逐一比较其值与关键字是否相同,相同则返回;若一直找不到,则返回-1。...原创 2018-08-22 17:14:33 · 13267 阅读 · 1 评论