//问题是:有一万个员工在公司上班,公司为了统计上班人的年纪分布情况,
//请将这一万多的人的年纪进行排序,分析一个比较好的算法.#include
#include
#include
#include
#include
#define _MAX_AGE_ 100
#define _MIN_AGE_...
分类:
编程语言 时间:
2015-05-26 09:19:05
阅读次数:
140
Given an array where elements are sorted in ascending order, convert it to a height balanced BST.解题思路:用一个有序数组,创建一个平衡二叉查找树。为确保平衡,需要满足两子树的高度差不大于1,可以通过设置...
分类:
其他好文 时间:
2015-05-21 06:37:05
阅读次数:
123
二分查找利用分治法,逐渐苏小查找范围,适用于有序数组。时间复杂度是O(log2N).PS:二分查找算法的判定过程实际上可以借助一棵平衡二叉树来描述,中间位置的关键字可以看成二叉树的根节点。C++代码如下: 1 #include 2 using namespace std; 3 template .....
分类:
编程语言 时间:
2015-05-20 00:24:06
阅读次数:
130
为什么实用二叉树
一,在有序数组中插入删除数据太慢
1插入或者删除一条数据会移动后面的所有数据
二,在链表中查找数据太慢
2查找只能从头或者尾部一条一条的找
用树解决问题
有没有一种插入和删除像链表那么快,查询可以向有序数组一样查得快那样就好了。
数实现了这些特点,称为了最有意思的数据结构之一
树的术语
如下图
树分平衡树和非平衡树
...
分类:
编程语言 时间:
2015-05-15 12:08:28
阅读次数:
189
问题描述:如何在有序数组中给出指定数字出现的次数,例如:数组{1,2,2,2,3,4,5} 数字2的出现次数为3。
最简单的方法是遍历数组,代码如下:
#include
//如何在有序数组中给出指定数字出现的次数
int binarysearch(int *a,int n,int x)
{
int cnt=0;
for(int i=0;i<n;i++)
{
if(a[i]==x)
...
分类:
编程语言 时间:
2015-05-15 12:06:47
阅读次数:
126
紫书上叫中途相遇法,还有一个名字感觉更加妥帖一点,叫:折半枚举。 有时候,当问题的规模较大时,无法枚举所有元素的组合,但能够枚举一半的元素组合,此时,将问题拆成两半后分别枚举,再合并他们的结果这一方法往往非常有效。
两重循环加二分,总复杂度为n^2logn
这里值得一提的是对集合CD的存储方式,我是用了一个有序数组,也可以用其他方式。
#include
using nam...
分类:
其他好文 时间:
2015-05-13 21:56:06
阅读次数:
138
1、 由于是有序数组,log(n)的时间查找最小值的index1.1 一定要注意当m、r、l三个位置相同值时,无法区分左右了,所以需要在l到r区间遍历找到最小元素。2、 看最小值index的左右两侧,是否查找值落在 [l,i] 与 [i,r] 上,在对应区间上进行二分查找 1 #include 2 ...
分类:
编程语言 时间:
2015-05-12 10:46:45
阅读次数:
124
poj2299题目链接
题意:
一个含有n个数的数组, 每次只能交换相邻的两个数, 求最少操作多少次可以使该数组变成一个有序数组(从小到大)。
分析:
先说一下归并排序吧。 二分的思想, 就是将一元素集合分割成两个或更多个子集合,对每一个子集合分别排序,然后将排好序的子集合归并为一个集合。看图理解会好一点!
归并排序核心操作:将一维数组中前后相邻的两个有序序列归并为一个有序序列。那看一下我...
分类:
其他好文 时间:
2015-05-12 09:31:45
阅读次数:
183
poj2299 http://poj.org/problem?id=2299题意:一个含有n个数的数组, 每次只能交换相邻的两个数, 求最少操作多少次可以使该数组变成一个有序数组(从小到大)。分析:先说一下归并排序吧。 二分的思想, 就是将一元素集合分割成两个或更多个子集合,对每一个子集合分别排序,...
分类:
其他好文 时间:
2015-05-11 23:30:31
阅读次数:
173