算法导论
文章平均质量分 78
fanhj__2007
这个作者很懒,什么都没留下…
展开
-
插入排序
插入排序就像摸牌一下,手中的牌一直都是排好序的,新的牌插到这个已排序序列中算法复杂度:最佳情况:T(n) = O(n) 最坏情况:T(n) = O(n^2) C++代码实现如下:#include using namespace std;typedef int ElementType;void InsertionSort(ElementTyp原创 2010-04-28 16:54:00 · 248 阅读 · 0 评论 -
选择排序
选择排序就像对一堆乱序的扑克牌进行排序,每次都从为排序的扑克牌中取出最大的放到新的扑克牌序列中算法复杂度:O(N^2)选择排序的C++代码:/*************************************************Function: SelectionSortDescription:对数组C进行排序Input: A:ElementType类型的数组原创 2010-04-29 10:44:00 · 315 阅读 · 0 评论 -
求解所有集合中和为给定值的组合
问题描述:给定一个由n个整数构成的集合S和另一个整数x,求解S中所有的两个数的组合,其和为x算法分析:首先通过Merge Sort进行排序,复杂度:O(NlgN)然后利用Binary search查找x- s[i],这里需要一个循环来遍历整个集合,所以复杂度为N*O(lgN)= O(NlgN)整个算法的复杂度为:O(NlgN) C++实现代码如下:#include原创 2010-04-29 13:57:00 · 758 阅读 · 0 评论 -
Merge排序
分治法三个步骤:分解(divide):将原问题分解成若干个自问题解决(conquer):递归地解决这些子问题,若子问题足够小,就直接解决合并(combine):将子问题的解合并成原问题的解Merge排序就是通过分治法解决的经典算法,其实的Merge过程就可以用扑克牌来做比喻,两堆已排序的牌面朝上,放在桌面上,我们希望合并成一个新的已排序的扑克牌序列 算法复杂度:O(NlgN原创 2010-04-29 01:20:00 · 719 阅读 · 0 评论 -
Binary Search
Binary Search:对一个已经排好序的序列,比较序列中点与查找数,其中一般序列就不需要考虑了,如此重复。算法复杂度:O(lg(N))C++代码实现如下:/*************************************************Function: BinarySarchDescription:在已经从大到小排序的数组中查找某个元素的位置Inp原创 2010-04-29 12:45:00 · 457 阅读 · 0 评论 -
求解逆序对
问题描述:设A[1..n]是一个包含n个不同数的数组,如果在i 的情况下,有A[i] >A[j],则(I,j)称为A的一个逆序对利用插入排序和归并排序实现的代码如下,其复杂度分别为各自排序算法复杂度#include using namespace std;typedef int ElementType;int InsertionSort_Inversion(原创 2010-04-30 00:17:00 · 2130 阅读 · 1 评论 -
快速排序 QuickSort
快速排序通常用于排序的最佳的使用选择,其期望运行时间为:O(nlgn),能够进行就地排序。最坏运行时间为:O(n^2)算法描述:分解(divide):数组A[beg…end]被划分为两个子数组A[beg…mid - 1]和A[mid + 1…end],使得A[beg…mid - 1]中的数据都小于A[mid],A[mid + 1…end]中的数据都大于A[mid]解决(conquer)原创 2010-05-04 16:01:00 · 335 阅读 · 0 评论 -
堆排序 heapSort
堆排序是一种原地(in place)排序算法,二叉堆有两种:最大堆和最小堆Max_Heapify过程:保持最大堆性质的关键,父结点大于等于子节点, 运行时间: O(lgN)Bulid_Max_Heap过程:遍历整个数组,调用Max_Heapify过程,保持所有元素的最大堆性质,构建最大堆,运行时间:O(n)Heap_Sort过程:遍历整个数组,交换首位元素,并提取首元素,调用Max_H原创 2010-05-04 10:16:00 · 374 阅读 · 0 评论