随笔分类 -  Data structrure and algorithm

冒泡排序最佳情况的时间复杂度,为什么是O(n)
摘要:我在许多书本上看到冒泡排序的最佳时间复杂度是O(n),即是在序列本来就是正序的情况下。但我一直不明白这是怎么算出来的,因此通过阅读《算法导论-第2版》的2.2节,使用对插入排序最佳时间复杂度推算的方法,来计算冒泡排序的复杂度。1. 《算法导论》2.2中对插入排序最佳时间复杂度的推算 在最好情况下,6和7总不被执行,5每次只被执行1次。因此, 时间复杂度为O(n)2. 冒泡排序的时间复杂度 2.1 排序代码public void bubbleSort(int arr[]) { for(int i = 0, len = arr.length; i < len - 1; i++) {... 阅读全文
posted @ 2012-09-20 11:23 melon.h 阅读(50129) 评论(19) 推荐(14) 编辑
递归式的时间复杂度-以快速排序为例
摘要:主方法(master method)给出求解以下形式递归式的“食谱”方法主定理:T[n] = aT[n/b] + f(n)其中a>=1 and b>1是常量,并且f(n)是一个渐进正函数考虑以下三种情况:1. 如果f(n)=O(n^(logb(a) - E))对于某个常量E>0成立,那么T[n]=O(n^(logb(a)))2. 如果f(n)=O(n^(logb(a))),则T[n]=O(n^(logb(a)) ^ logn)3.如果f(n)=O(n^(logb(a) + E))对于某个常量E>0成立,且对常数c<1有足够大的n,有af(n/b)<=cf(n 阅读全文
posted @ 2012-09-20 01:07 melon.h 阅读(2307) 评论(0) 推荐(0) 编辑
快速排序 quickSort
摘要:快速排序利用了分治法的算法思想。1. 分治法的基本思想 将原问题分解为若干个规模更小的但结构与原文题相似的问题。递归地解决这些子问题。2. 变速排序的基本思想 在R[low.......high]中选择一个记录作为基准,将序列划分为左、右两个较小的子区间,使左边的序列均小于基准值,右边的序列均小于基准值。3. 代码void quickSort(int arr[], int start, int end) { // 当start < end或start == end时不做任何操作 if(start < end) { int pivotpos = partition(arr, sta. 阅读全文
posted @ 2012-09-19 19:27 melon.h 阅读(309) 评论(0) 推荐(0) 编辑