algorithm
Hadas-Wk
想法驱动实践!
展开
-
算法基础--插入排序递归版
1.原址插入排序注意:算法导论中的数组下标从1开始,C程序中是从0开始的。void insertion_sort(int A[], int length){ int i, j; int key; for(j = 1; j < length; j++) { key = A[j]; i = j - 1; wh原创 2016-01-16 23:06:51 · 1142 阅读 · 0 评论 -
快排的递归和非递归版本
1.递归有3种版本,下面值列出两种,另一种其实跟列出的两种的一个变种。 (1)算导版本(伪代码):(2)前后依次覆盖版本:#include#include#include#include#includeusing namespace std; /**把数组分为两部分,轴pivot左边的部分都小于轴右边的部分**/template int partit原创 2016-03-17 21:10:15 · 6718 阅读 · 0 评论 -
教你如何迅速秒杀掉:99%的海量数据处理面试题
原文:http://blog.csdn.net/v_july_v/article/details/7382693教你如何迅速秒杀掉:99%的海量数据处理面试题作者:July出处:结构之法算法之道blog前言 一般而言,标题含有“秒杀”,“99%”,“史上最全/最强”等词汇的往往都脱不了哗众取宠之嫌,但进一步来讲转载 2016-03-13 16:02:54 · 414 阅读 · 0 评论 -
算导--6.5-9使用最小堆完成k路归并问题
题目:请设计一个时间复杂度为O(nlgk)的算法,它能够将k个有序链表合并为一个有序链表,这里n是所有输入链表包含 的总的元素个数。(提示:使用最小堆完成k路归并)思路:建一个大小为k的堆,堆中的每个元素代表一个List,元素的key为List当前最小元素的值,调整为最小堆,取出堆顶的元素,并记录到排序结果中,然后插入相应List中下一个元素的值作为新的堆顶元素key的值,然后调整堆为最小原创 2016-03-12 22:32:39 · 1249 阅读 · 0 评论 -
算导6.2-5--维护最大堆的性质的递归版和非递归版
首先明确维护最大堆的前提条件是:根A[i]的左右子树LEFT[i]和RIGHT[i]都是最大堆,但根A[i]可能小于左右孩子。1.递归版主要思想:程序的每一步是找到A[i]和A[LEFT[i]]和A[RIGHT[i]]的最大值,然后跟A[i]交换,但交换后下标是largest的结点的值可能是原来的A[i]的值。这就可能破坏最大堆性质,需要该子树进行递归调用MAX-HEAPIFY。伪代码原创 2016-03-10 23:36:07 · 816 阅读 · 0 评论 -
算导--12.3-1二叉搜索树插入的递归版本
二叉搜索树插入元素key的递归版本主要思想:从树根开始,比较key与树根的元素的大小:若小于,判断新树根左孩子是否为空,若为空则此左孩子所在位置即为插入点,若为空则把树根的左孩子作为新的树根进行递归处理;若大于或等于,判断新树根右孩子是否为空,若为空则此右孩子所在位置即为插入点,若为空则把树根的右孩子作为新的树根进行递归处理;关键代码如下://递归版本 void R原创 2016-04-01 00:22:00 · 523 阅读 · 0 评论 -
算导--最大子数组问题
把一段时间内的股票怎样低价买进,高价卖出问题,转化为对股票每日价格变化量数组A,在A中找到一个和最大的非空连续子数组问题。我们称这样的非空连续子数组为最大子数组。对于这个问题有三种解法,即暴力求解方法、使用分之策略的求解方法和未使用分治策略的线性求解方法,下面依次给出。1.暴力求解方法 这种方法是最容易想到的方法,即简单的尝试每对可能的买进和卖出日期组合,其实就是组合问题,运行时间O原创 2016-03-06 17:54:01 · 724 阅读 · 0 评论 -
算导--7.4-5改进的快排
先粗粒度排序,然后当子数组长度小于k时,用插入排序,运用当输入数据几乎有序时,插入排序很快的思想。#includeusing namespace std;//7.4-5利用插入排序改善快排int k = 4;//划分int Partition(int *A, int p, int r){ //选择A[r]作为主元 int x = A[r]; int i = p - 1, j原创 2016-03-15 22:53:09 · 624 阅读 · 0 评论 -
算导--7-2-b.构造新的PARTITION'(A, p, r)
修改PARTITION(A, p, r)来构造一个新的PARTITION'(A, p, r),他排列A[p..r]的元素,返回值是两个数组下标q和t,其中,pA[p..q-1]的中的元素都小于A[q],A[q..t]的元素都相等,A[t+1..r]的中的元素都大于A[q]。时间复杂度是O(r-p)。伪代码如下:主要思想:若A[j]比A[p]小,则把目前标识与A[p]相等的值的最原创 2016-03-15 22:48:05 · 1313 阅读 · 0 评论 -
算导2-4--逆序对问题
问题:假设A[1..n]是一个有n个不同数的数组。若i A[j],则对偶(i, j)成为A的一个逆序对(inversion)。d.给出一个确定在n个元素的任何排列中逆序对数量的算法,最坏情况需要O(nlgn)时间。 思路:由归并排序算法的思想可以知道,两个子序列L(i)和R(j)归并前各自有序,归并为A(k)后整体有序。归并前,若R(j)中有一个数x小于L(i)中的一个数y,即x原创 2016-01-20 00:07:05 · 742 阅读 · 0 评论 -
算导2.3-7--存在与否问题
问题:描述一个运行时间为Θ(nlgn)的算法,给定n个整数的集合S和另一个整数x,该算法能确定S中是否存在两个其和刚好为x的元素。(代码就不写了,比较简 单)方法一:使用归并排序+二分查找,具体步骤如下:(1)对集合S进行归并排序(非降序);(2)从集合S中选择一个元素S(i),计算x与S(i)的差值y=x-S(i)。在集合S中查找除S(i)原创 2016-01-18 21:57:38 · 938 阅读 · 0 评论 -
华为OJ-岛屿个数问题
题目:岛屿的个数给一个01矩阵,求不同的岛屿的个数。0代表海,1代表岛,如果两个1相邻,那么这两个1属于同一个岛。我们只考虑上下左右为相邻。样例在矩阵:[ [1, 1, 0, 0, 0], [0, 1, 0, 0, 1], [0, 0, 0, 1, 1], [0, 0, 0, 0, 0], [0, 0, 0, 0, 1]]中有 3 个岛.原创 2016-09-09 00:15:29 · 3678 阅读 · 0 评论