随笔分类 - 排序算法
各种排序算法
摘要:分治思想:合并排序和快速排序 分治思想(Divide-and-conquer): 作为程序设计的一种方法,有时为了解决一个给定的问题,算法要一次或多次地递归调用自身来解决相关的子问题。这些算法通常采用分子的策略:将一个问题划分成n个规模更小并且结构和原问题相似的子问题;递归地解决这些子问题,然后再合并其结果,就得到原问题的解。 一般采用分治方法解决问题,按如下三个步骤不断循环:分解( Divide ): 将原问题分解成许多个规模更小并且和原问题结构相似的小问题控制(Conquer): 从小问题的层次上着手解决问题。(在递归层面上:1. 小问题如何解决 2. 做下一层递归的条件如何设置)合...
阅读全文
摘要:冒泡排序(Bubble sort)和选择排序(Selection sort) 初看冒泡排序和选择排序不禁会问它们有什么区别? 的确, 它们的基本思想是一样的. 都是通过一轮的循环找到所要排序数中的最值(最大值或最小值), 然后将最值置于顶端. 它们的区别主要体现在对其他数(非最值)的处理上. 冒泡排序: 通过相邻的两个数的比较, 根据需要决定是否将两个数互换位置, 然后将比较往前(或往后)推进. 例如, 要求从小到大排序. 通过将两个数比较, 将较大的数置换到右边. 如此不断循环将得到最值. 选择排序: 和冒泡排序不同, 选择排序使用标记最值所在位置的方式, 查找最值过程中不移动数位置,...
阅读全文
摘要:堆排序和优先级队列 堆排序:和合并排序一样,时间复杂度为O(nlgn);同时和插入排序一样,在原序列中进行;这样堆排序集合了合并排序和插入排序的优点。 堆排序的另一个特点是利用了"堆"这种数据结构. 堆数据结构还不止在堆排序中有用,还可以构成一个有效的优先队列. 堆: 是一种数据结构,也是一种数组对象,如图 1-1所示:图 1-1 最大堆(图片来源《算法导论》) 如上图1-1 所示, 可以被看成一棵完全二叉树,二叉树的的每个节点和数组中存放该节点的那个元素对应.在使用"堆"数据机构的时候,其实并不需求真正构建一棵完全二叉树, 数据的存储依然是在一个数组中
阅读全文