- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章c++归并排序详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
说一说归并排序 。
归并排序:归并排序(英语:Merge sort,或mergesort),是创建在归并操作上的一种有效的排序算法,效率为O(n log n)。1945年由约翰·冯·诺伊曼首次提出。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行.
归并排序的核心思想是将两个有序的数列合并成一个大的有序的序列。通过递归,层层合并,即为归并.
。
如图,从下到上,每一步都需要将两个已经有序的子数组合并成一个大的有序数组,如下是实现合并的具体代码,请读者细细体会 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
void
merge(
int
arr[],
int
l,
int
mid,
int
r)
{
int
aux[r-l+1];
//开辟一个新的数组,将原数组映射进去
for
(
int
m=l;m<=r;m++)
{
aux[m-l]=arr[m];
}
int
i=l,j=mid+1;
//i和j分别指向两个子数组开头部分
for
(
int
k=l;k<=r;k++)
{
if
(i>mid)
{
arr[k]=aux[j-l];
j++;
}
else
if
(j>r)
{
arr[k]=aux[i-l];
i++;
}
else
if
(aux[i-l]<aux[j-l])
{
arr[k]=aux[i-l];
i++;
}
else
{
arr[k]=aux[j-l];
j++;
}
}
}
|
上图代码已经完成了归并中的“并”这一部分,归并归并,有并必有归,如下实现“归”的部分 。
1
2
3
4
5
6
7
8
9
|
void
merge_sort(
int
arr[],
int
l,
int
r)
{
if
(l >=r)
return
;
int
mid=(l+r)/2;
merge_sort(arr,l,mid);
merge_sort(arr,mid+1,r);
merge(arr,l,mid,r);
}
|
由于上图中的l,r不方便使用者调用,于是我们创建一个方便自己调用的my_merge_sort函数 。
1
2
3
4
|
void
my_merge_sort(
int
arr[],
int
n)
{
merge_sort(arr,0,n-1);
}
|
以上我们便实现了归并排序中的归和并,归并排序是利用二分法实现的排序算法,时间复杂度为nlogn,是一种比较快速的排序算法。如下是笔者自己写的归并排序的全部代码, 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
#include <iostream>
using
namespace
std;
void
merge(
int
arr[],
int
l,
int
mid,
int
r)
{
int
aux[r-l+1];
//开辟一个新的数组,将原数组映射进去
for
(
int
m=l;m<=r;m++)
{
aux[m-l]=arr[m];
}
int
i=l,j=mid+1;
//i和j分别指向两个子数组开头部分
for
(
int
k=l;k<=r;k++)
{
if
(i>mid)
{
arr[k]=aux[j-l];
j++;
}
else
if
(j>r)
{
arr[k]=aux[i-l];
i++;
}
else
if
(aux[i-l]<aux[j-l])
{
arr[k]=aux[i-l];
i++;
}
else
{
arr[k]=aux[j-l];
j++;
}
}
}
//递归的使用归并排序,对arr[l....r]排序
void
merge_sort(
int
arr[],
int
l,
int
r)
{
if
(l >=r)
return
;
int
mid=(l+r)/2;
merge_sort(arr,l,mid);
merge_sort(arr,mid+1,r);
merge(arr,l,mid,r);
}
void
my_merge_sort(
int
arr[],
int
n)
{
merge_sort(arr,0,n-1);
}
int
main()
{
int
a[6];
for
(
int
i=0;i<6;i++)
{
cin>>a[i];
}
my_merge_sort(a,6);
for
(
int
i=0;i<6;i++)
{
cout<<a[i]<<
" "
;
}
return
0;
}
|
上面实现的归并排序是自顶向下的,我们可以以另外一种方向来实现归并,改递归为迭代。如下实现 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
#include <iostream>
#include <math.h>
using
namespace
std;
void
merge(
int
arr[],
int
l,
int
mid,
int
r)
{
int
aux[r-l+1];
//开辟一个新的数组,将原数组映射进去
for
(
int
m=l;m<=r;m++)
{
aux[m-l]=arr[m];
}
int
i=l,j=mid+1;
//i和j分别指向两个子数组开头部分
for
(
int
k=l;k<=r;k++)
{
if
(i>mid)
{
arr[k]=aux[j-l];
j++;
}
else
if
(j>r)
{
arr[k]=aux[i-l];
i++;
}
else
if
(aux[i-l]<aux[j-l])
{
arr[k]=aux[i-l];
i++;
}
else
{
arr[k]=aux[j-l];
j++;
}
}
}
void
mergesort(
int
arr[],
int
n)
{
for
(
int
sz=1;sz<=n;sz+=sz)
{
for
(
int
i=0;i+sz<n;i+=sz+sz)
//i+sz防止越界
{
//对arr[i...sz-1]和arr[i+sz.....i+2*sz-1]进行排序
merge(arr,i,i+sz-1,min(i+sz+sz-1,n-1));
//min函数防止越界
}
}
}
int
main()
{
int
a[5];
for
(
int
i=0;i<5;i++)
{
cin>>a[i];
}
mergesort(a,5);
for
(
int
i=0;i<5;i++)
{
cout<<a[i]<<
" "
;
}
return
0;
}
|
原文链接:http://www.cnblogs.com/agui521/p/6918229.html 。
最后此篇关于c++归并排序详解的文章就讲到这里了,如果你想了解更多关于c++归并排序详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在尝试对每个条目有多个值的关联数组进行排序。 例如 [0] => stdClass Object ( [type] => node [sid] => 158 [score] => 0.059600
我在 mysql 中有“日期”列以这种格式保存日期 2014 年 9 月 17 日(日-月-年) 我需要对它们进行升序排序,所以我使用了这个命令: SELECT * FROM table ORDER
我目前正在将 MySQL 存储过程重写为 MS SQL 存储过程,但遇到了问题。 在 MySQL 存储过程中,有一个游标,它根据最近的日期 (effdate) 选择一个值并将其放入变量 (thestt
我想要 gwt r.QuestionId- 排序。但是我得到未排序的 QuestionId 尽管我提到了 QuestionId ASC 的顺序。 SELECT r.QuestionId,
我有一个关于在 scandir 函数中排序的基本问题。到目前为止,我阅读了 POSIX readdir 的手册页,但没有找到有关订购保证的具体信息。 但是当我遍历大目录(无法更改,只读)时,我在多个系
基本上我必须从 SQL 数据库中构建项目列表,但是用户可以选择对 7 个过滤器的任意组合进行过滤,也可以选择要排序的列以及按方向排序。 正如您可以想象的那样,这会以大量不同的组合进行编码,并且数据集非
我有两张 table 。想象第一个是一个目录,包含很多文件(第二个表)。 第二个表(文件)包含修改日期。 现在,我想选择所有目录并按修改日期 ASC 对它们进行排序(因此,最新的修改最上面)。我不想显
我想先根据用户的状态然后根据用户名来排序我的 sql 请求。该状态由 user_type 列设置: 1=活跃,2=不活跃,3=创始人。 我会使用此请求来执行此操作,但它不起作用,因为我想在“活跃”成员
在 C++ 中,我必须实现一个“类似 Excel/Access”(引用)的查询生成器,以允许对数据集进行自定义排序。如果您在 Excel 中使用查询构建器或 SQL 中的“ORDER BY a, b,
我面临这样的挑战: 检索按字段 A 排序的文档 如果字段 B 存在/不为空 . 否则 按字段排序 C. 在 SQL 世界中,我会做两个查询并创建一个 UNION SELECT,但我不知道如何从 Mon
我想对源列表执行以下操作: map 列表 排序 折叠 排序 展开 列表 其中一些方法(例如map和toList)是可链接的,因为它们返回非空对象。但是,sort 方法返回 void,因为它对 List
我制作了一个用于分析 Windows 日志消息编号的脚本。 uniq -c 数字的输出很难预测,因为根据数字的大小会有不同的空白。此时,我手动删除了空白。 这是对消息进行排序和计数的命令: cat n
我有以下词典: mydict1 = {1: 11, 2: 4, 5: 1, 6: 1} mydict2 = {1: 1, 5: 1} 对于它们中的每一个,我想首先按值(降序)排序,然后按键(升序)排序
我刚刚开始使用泛型,目前在对多个字段进行排序时遇到问题。 案例: 我有一个 PeopleList 作为 TObjectList我希望能够通过一次选择一个排序字段,但尽可能保留以前的排序来制作类似 Ex
有没有办法在 sql 中组合 ORDER BY 和 IS NULL 以便我可以在列不为空时按列排序,但如果它为null,按另一列排序? 最佳答案 类似于: ORDER BY CASE WHEN
我有一个包含 2 列“id”和“name”的表。 id 是常规的自动增量索引,name 只是 varchar。 id name 1 john 2 mary 3 pop 4 mary 5 j
场景 网站页面有一个带有分页、过滤、排序功能的表格 View 。 表中的数据是从REST API服务器获取的,数据包含数百万条记录。 数据库 REST API 服务器 Web 服务器 浏览器 问
假设我有一本字典,其中的键(单词)和值(分数)如下: GOD 8 DONG 16 DOG 8 XI 21 我想创建一个字典键(单词)的 NSArray,首先按分数排序,然后按字
如何在 sphinx 上通过 sql 命令选择前 20 行按标题 WEIGHT 排序,接下来 20 行按标题 ASC 排序(总共 40 个结果),但不要给出重复的标题输出。 我尝试了这个 sql 命令
我有一个奇怪的问题,当从 SQLite 数据库中选择信息并根据日期排序时,返回的结果无效。 我的SQL语句是这样的: Select pk from usersDates order by dateti
我是一名优秀的程序员,十分优秀!