随笔分类 - 结构
【经典算法】第九回:基数排序
摘要:1.概述基数排序(Radix sort)是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。基数排序的发明可以追溯到1887年赫尔曼·何乐礼在打孔卡片制表机(Tabulation Machine)上的贡献。原理:将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。基数排序的时间复杂度是 O(k·n),其中n是排序元素个数
阅读全文
【经典算法】第八回:桶排序
摘要:1.概述桶排序 (Bucket sort)或所谓的箱排序,工作的原理是将阵列分到有限数量的桶子里。每个桶子再个别排序(有可能再使用别的排序算法或是以递回方式继续使用桶排序进行排序)。桶排序是鸽巢排序的一种归纳结果。当要被排序的阵列内的数值是均匀分配的时候,桶排序使用线性时间(Θ(n))。但桶排序并不是 比较排序,他不受到 O(n log n) 下限的影响,速度是比较快的。步骤:设置一个定量的阵列当作空桶子。寻访序列,并且把项目一个一个放到对应的桶子去。对每个不是空的桶子进行排序。从不是空的桶子里把项目再放回原来的序列中。理解:例如待排数字 [6 2 4 1 5 9],准备10个空桶,最大数个空
阅读全文
【经典算法】第七回:堆排序
摘要:1.概述堆排序(Heap Sort)就是利用堆(假设利用大顶堆)进行排序的方法。原理:将待排序的序列构造成一个大顶堆,此时,整个序列的最大值就是堆顶的根结点,将 它移走(其实就是将其与堆数组的末尾元素交换,此时末尾元素就是最大值),然后将剩余的n-1个序列重新构造成一个堆,这样就会得到n个元素中的次小值。,如此反复执行,便能得到一个有序序列了,堆排序的时间复杂度为O(nlogn)。1.1 什么是堆这里的堆(二叉堆),指得不是堆栈的那个堆,而是一种数据结构。堆可以视为一棵完全的二叉树,完全二叉树的一个“优秀”的性质是,除了最底层之外,每一层都是满的,这使得堆可以利用数组来表示,每一个结点对应数组
阅读全文
【经典算法】第六回:归并排序
摘要:1.概述原理:把原始数组分成若干子数组,对每一个子数组进行排序,继续把子数组与子数组合并,合并后仍然有序,直到全部合并完,形成有序的数组,因此空间复杂度为O(n)。归并操作的过程如下:申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列设定两个指针,最初位置分别为两个已经排序序列的起始位置比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置重复步骤3直到某一指针达到序列尾将另一序列剩下的所有元素直接复制到合并序列尾理解:递归便是深度遍历(如下由左至右进行遍历),假设有这样的一列数组{9,8,7,6,5,4,3,2,1}进行划分的顺序如下:{9,8,7,
阅读全文
【经典算法】第五回:冒泡排序
摘要:1.概述原理:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止,时间复杂度为O(n2)。就好像是水里的东西,重量轻的会浮在上面,重点的是下面一层,最重的在最下层。2.示例 //冒泡排序 public static void BubbleSort(int[] nums) { int temp; for (int i = 0; i < nums.Length - 1; i++) { for (int j = nums.Length - 1; j ...
阅读全文
【经典算法】第四回:希尔排序
摘要:1.概述希尔排序的实质就是分组插入排序,该方法又称缩小增量排序,因DL.Shell于1959年提出而得名。原理:先将序列分割成若干个子序列(由相隔某个“增量”的 元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。插入排序在元素基本有序的情况下,效率会更高,因此先分组,再插入排序,再组装,已达到序列基本有序,所以希尔排序在时间效率上比插入排序有较大提高,时间复杂度为O(n3/2)。2.示例 //希尔排序 public static void ShellSort(int[] num...
阅读全文
【经典算法】第三回:插入排序
摘要:1.概述原理:将数组分为无序区和有序区两个区,然后不断将无序区的第一个元素按大小顺序插入到有序区中去,最终将所有无序区元素都移动到有序区完成排序,杂度为O(n2)。步骤:遍历从第二个元素开始,比较前面的元素是否大于该元素,大于的话,交换位置。依此类推。理解:手上有一副牌,要按照从小到大的顺序排序,先把第2张跟第一张进行比较,如果第一张大于第二张就调用。再拿第3张牌跟前面两张进行比较,先比较第二张,如果大于换位置,再比较第一张。再拿第4张牌跟前面3张从右往左进行比较,其它牌依此类推。2.示例 //插入排序 public static void InsertionSor...
阅读全文
【经典算法】第二回:选择排序
摘要:1.概述原理:从序列中,每次把最小的一个元素放在左边,依次类推,已达到排序,查找最小的元素需要一个遍历过程,而排序也要一个遍历过程,这个算法的时间复杂度也是O(n*n)。步骤:遍历找出最小的一个元素,插入最左边;最小元素插入到左边,再查找剩余元素中最小元素,再次插入到该元素的最左边,依次类推。2.示例 //选择排序 public static void SelectionSort(int[] nums) { for (int i = 0; i < nums.Length - 1; i++) { ...
阅读全文
【经典算法】第一回:快速排序
摘要:1.概述快速排序(Quick sort) 原理:选取一个基数,通过一次扫描将要排序的数据分割成两部分,其中一部分所有数据都比这个基数小,另外一部分所有数据都不小于这个基数,然后按照此方法进行递归,已达到排序。方法步骤:设定要排序的起始和结束位置选一个基数,一般直接选这个起始和结束坐标的中间坐标已这个基数为准,循环遍历集合,从起始坐标开始,把大于基数的放在基数的右边,从结束坐标开始查找,把小于基数的放在基数的左边。一次排序后,左边的数据都小于基数,右边的都大于基数,再重新开始上面的步骤1,2,32.示例 public static void QuickSort(int[] nums...
阅读全文
浙公网安备 33010602011771号