- 博客(5)
- 收藏
- 关注
原创 插入排序(InsertionSort)
算法描述 对数组A[1...n]A[1...n]进行排序时,插入排序算法从左到右遍历整个数组,挨个将未排序元素从右到左和左边已经排好序的元素进行比较,直到找到第一个不大于它的元素时,将其插入作为该元素的后继;或者遍历结束也找不到,其便是新的最小值,插入作为首元素。完成插入从而使得有序区间的规模增一。当遍历结束时整个数组变得有序。 代码(JAVA) class InsertionSort {
2016-04-19 20:18:10
1344
原创 归并排序(MergeSort)
和分治思想的第一次相遇 当问题的规模是可以划分的时候,分治的算法往往是很有效的: 不断分割问题的规模,直到子问题的规模足够小便直接求解,之后不断整合子问题的解得到更大规模的解,最后得到完全解。 归并排序就是分治算法的一个简单的例子。 可能有人觉得快速排序也是属于分治算法,但我不这么觉得,因为快速排序是先得到大问题的解的一部分,再靠子问题来完成解, 并没有整合子问题这一步,所以硬要说的
2015-01-08 01:08:49
1474
原创 快速排序(QuickSort)
为什么叫快速排序 这个标题是带有歧义的,每一种排序都有自己的名字,有的是发明者+排序(Shell排序),有的是用的步骤名称+排序(插入排序)... 而快速排序是以它的属性+排序为名(这不是废话吗)。那么我再换个意义明确的标题: 快速排序为什么那么快 要弄明白这一点首先需要了解基于比较的排序模型:决策树 对大小为n的输入,其位置关系有n!种可能。排序算法的工作就是在所有
2015-01-05 17:30:18
1272
原创 堆排序(HeapSort)
(二叉)堆 虽然要搞清楚一组数据完整的大小关系很费时间,但如果只想弄明白一部分大小关系的话就能在很短的时间内确定, 这就是堆序的思想: 把数组按下标排成一棵完全二叉树,该树满足的“一部分大小关系”就是所有节点是它所在子树的最大值(最大堆性质) 下标关系 对于二叉堆父节点下标和其两个孩子节点下标的关系很明显: #define PARENT(i) (i >> 1) ///
2015-01-01 16:25:03
1073
原创 希尔排序(ShellSort)
最后分析的基于比较的排序 之所以放在前面几个排序算法之后主要是因为虽然希尔排序很容易编写却很难分析,尤其是它的时间复杂度。 希尔排序思想的提出是有原因的:在那个排序还基本都是2次型(插入,选择,冒泡...)的年代,当人们经常使用 插入排序时发现有时突然插入一个很小的元素时总是“一步一步”地往前移很久,真的是让人很不爽,电脑就像瞎子一样要一个一个摸索。 因此D.L.Shell做了启发性的尝试
2014-12-31 22:34:56
1236
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人