
分治法
文章平均质量分 71
taesimple
这个作者很懒,什么都没留下…
展开
-
单链表快排
在单链表上实现快排,需要考虑以下几个因素: 单链表存取随机结点需要从头遍历指针单向,取前驱结点需要从头遍历不能像数组那样以下标判断越界 因此,我们使用一趟排序中的策略三,其好处是:只要维护足够多(实际上也并不多)的指针,就能只遍历一次即完成一趟排序 但和数组快排不同的是: 为了方便,不使用三数中值分割法选取pivot(需要遍历一次链表),而直接使用当前子链表的第一个结点作为原创 2012-05-09 17:10:36 · 1129 阅读 · 0 评论 -
判断一个数是不是某个自然数的平方
基本思路是二分查找,只是判断标准变为x^2 ?= key 改进思路是缩小二分查找的起始区间,步骤如下: 设被查找数为N,令A = 1,B = N每次令 A *= 2, B /= 2,直到A >= B停止此时,若A == B,则N是A的平方;若A > B,则二分查找的初始区间为[B, A]若二分查找失败,则N不是某个自然数的平方 改进思路的证明:假设存在K,使得2^K >= N/(2^原创 2012-05-14 20:58:17 · 946 阅读 · 0 评论 -
分治法+一趟排序求数组中第K大的元素
算法思想见题库 代码如下: void swap(int * a, int * b){ assert(a != NULL); assert(b != NULL); if(a != b){ *a ^= *b; *b ^= *a; *a ^= *b; } } int partition(int a[], int left, int right){ assert(a !=原创 2012-05-08 16:43:11 · 769 阅读 · 0 评论 -
快速排序(quick sort)
基本概念 快速排序的最差时间性能为O(n^2),期望时间性能为O(n*logn) 快速排序和归并排序一样,都属于分治法,其三个步骤如下 分解(关键步骤):将序列(A[p], ..., A[r])划分成两个(可能空)的子序列(A[p], ..., A[q-1])和(A[q+1], ..., A[r]),使得(A[p], ..., A[q-1])中的任意元素均小于等于A[q],(A[q+1]原创 2011-07-26 19:50:54 · 274 阅读 · 0 评论 -
归并排序(merge sort)
归并排序时间复杂度为O(n*logn),需要和待排序列相同大小的辅助空间,是一种稳定排序 非递归实现的归并排序效率要高得多 归并排序属于分治法的一种,分治法定义为:将原问题划分为n个规模较小而结构与原问题相似的子问题,递归解决这些子问题,然后合并结果,得出原问题的解。因此分治法有以下三个步骤: 分解:将原问题分解为一系列结构相似的子问题递归求解:对子问题递归求解合并(非必须,如二分查找、原创 2011-07-01 13:45:00 · 239 阅读 · 0 评论