jake1036
My Links
C++博客
首页
新随笔
联系
聚合
管理
Blog Stats
Posts - 101
Stories - 0
Comments - 23
Trackbacks - 0
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
(1)
给我留言
查看公开留言
查看私人留言
随笔分类
c++学习总结(7)
(rss)
larbin源码分析(4)
(rss)
算法相关(65)
(rss)
随笔档案
2011年9月 (4)
2011年8月 (1)
2011年7月 (5)
2011年6月 (24)
2011年5月 (34)
2011年4月 (10)
2011年3月 (4)
2010年12月 (1)
2010年11月 (7)
2010年10月 (5)
2010年9月 (5)
2010年8月 (1)
搜索
最新评论
1. re: 01背包问题总结(一)http://www.cppblog.com/Modules/CaptchaImage/JpegImage.aspx
评论内容较长,点击标题查看
--http://www.cppblog.com/Modules/CaptchaImage/JpegIm
2. re: 编程之美-2.5寻求最大的K个数[未登录]
你确定以上代码可以运行?
呵呵
--xixi
3. re: larbin源码分析(七) larbin中的2种容器与4个url队列
评论内容较长,点击标题查看
--Humton
4. re: larbin源码分析(七) larbin中的2种容器与4个url队列
评论内容较长,点击标题查看
--Humton
5. re: 动态规划法-------最大连续子序列和
@123
谁说的,明明b[7] == 25好吧
--456
阅读排行榜
1. 01背包问题总结(一)(24983)
2. 动态规划法-------最大连续子序列和(9604)
3. c++类模板学习(8025)
4. 完全背包问题 <二>(4500)
5. 编程之美1.8-----电梯调度算法(4179)
评论排行榜
1. 2011-4-16 淘宝实习生面试总结(6)
2. 动态规划法-------最大连续子序列和(3)
3. 动态规划法-----最长增序子序列(非连续)(3)
4. 面试100 34找出数组中唯一出现一次的两个数字(2)
5. larbin源码分析(七) larbin中的2种容器与4个url队列(2)
中位数和顺序统计学
中位数和顺序统计学
1 求最大和最小值
求取最大和最小值,方法是成对的比较元素,两个元素之间较大值与max比较,较小值与min比较,这样每两个数字需要进行
3次比较,总共就进行了3[n/2]次比较。
若n为奇数,则min和max同时赋值为数组中的第一个元素
若n为偶数,则数组中的前两个元素,首先进行比较,分别赋值给min和max,然后剩余的元素逐对比较
代码如下:
/**/
/*
求取最大和最小值,方法是成对的比较元素,两个元素之间较大值与max比较,较小值与min比较,这样每两个数字需要进行
3次比较,总共就进行了3[n/2]次比较。
若n为奇数,则min和max同时赋值为数组中的第一个元素
若n为偶数,则数组中的前两个元素,首先进行比较,分别赋值给min和max,然后剩余的元素逐对比较、
*/
#include
<
iostream
>
using
namespace
std ;
void
minMax(
const
int
*
a ,
const
int
n ,
int
&
min ,
int
&
max) ;
inline
int
MIN(
int
x ,
int
y)
{
return
(x
<=
y)
?
x : y ;}
;
inline
int
MAX(
int
x ,
int
y)
{
return
(x
<=
y )
?
y : x ;}
;
void
find(
const
int
*
a ,
int
begin ,
const
int
n ,
int
&
min ,
int
&
max);
int
main()
{
int
a []
=
{
23
,
1
,
-
1
,
55
,
34
,
2
,
-
90
,
43
,
-
100
}
;
int
min
=
0
;
int
max
=
0
;
minMax(a ,
9
,min , max);
cout
<<
"
min:
"
<<
min
<<
"
max:
"
<<
max
<<
endl ;
cin.
get
() ;
return
0
;
}
void
minMax(
const
int
*
a ,
const
int
n ,
int
&
min ,
int
&
max)
{
if
(n
<
1
)
//
小于1 表示错误
{
return
;
}
if
(n
==
1
)
//
等于1 表示则直接返回结果
{
min
=
max
=
a[
0
] ;
return
;
}
if
((n
&
1
)
==
1
)
//
n为奇数
{
min
=
max
=
a[
0
] ;
//
同时赋值给第一个元素
find(a ,
1
, n , min , max);
}
else
//
n为偶数
{
min
=
MIN(a[
0
] , a[
1
]) ;
max
=
MAX(a[
0
] , a[
1
]) ;
find(a ,
2
, n , min , max);
}
}
//
每两个元素逐对比较
void
find(
const
int
*
a ,
int
begin ,
const
int
n ,
int
&
min ,
int
&
max)
{
for
(
int
i
=
begin ; i
<
n
-
1
;i
++
)
{
int
minTemp
=
MIN(a[i] , a[i
+
1
]) ;
int
maxTemp
=
MAX(a[i] , a[i
+
1
]) ;
if
(min
>
minTemp)
{
min
=
minTemp ;
}
if
(max
<
maxTemp)
{
max
=
maxTemp ;
}
}
}
2 利用分治法求取数组中任意的第i大数
随机选择第i大数字,借助于快排函数的partition()函数,将数组分成两个部分,则第i大数字必然在这两个部分之中的一个。
利用分治法进一步划分该问题。
/**/
/*
随机选择第i大数字,借助于快排函数的partition()函数,将
数组分成两个部分,则第i大数字必然在这两个部分之中的一个。
利用分治法进一步划分该问题。
*/
#include
<
iostream
>
using
namespace
std ;
int
partition(
int
*
a ,
int
p ,
int
q)
{
int
i
=
p
-
1
, x
=
a[q] ;
for
(
int
j
=
p ; j
<
q ; j
++
)
{
if
( a[j]
<=
x )
{
i
++
;
swap(a[i] , a[j]) ;
}
}
swap(a[i
+
1
] , a[q]) ;
return
i
+
1
;
}
int
select(
int
*
a ,
int
p ,
int
i ,
int
r)
{
if
(p
==
r)
return
a[p] ;
int
q
=
partition(a , p , r) ;
int
w
=
q
-
p
+
1
;
//
表示第一个区间中数字的个数
if
(w
==
i)
//
此处切记 i 不能与 q 进行比较 ,q仅仅返回数组中的下标
return
a[q] ;
if
(i
<
w)
//
表示在第一个区间中
return
select(a , p , i , q
-
1
) ;
else
return
select(a , q
+
1
, i
-
w , r) ;
}
int
main()
{
int
a []
=
{
12
,
4
,
23
,
5
,
7
,
2
,
11
}
;
//
2 , 4 , 5 ,7 ,11 , 12 , 23
int
res
=
select(a ,
0
,
4
,
6
) ;
cout
<<
"
res:
"
<<
res;
cin.
get
();
return
0
;
}
posted on 2011-04-06 15:37
kahn
阅读(523)
评论(0)
编辑
收藏
引用
所属分类:
算法相关
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
相关文章:
9-24MTK一面二面
微软笔试总结
2011-09-07xx移动创业公司笔试题
编程之美2.7 最大公约数
O(n)实现删除两个数组中的共同元素
编程之美1.9(二) 高效率地安排会面
分组背包问题(六)
二维背包问题(五)
多重背包(三)
完全背包问题 <二>
网站导航:
博客园
IT新闻
BlogJava
知识库
博问
管理
Powered by:
C++博客
Copyright © kahn