- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章c++实现二路归并排序的示例代码由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
二路归并排序 。
基本思想 。
二路归并排序就是将两个有序子表归并成一个有序表。首先我们得有一个算法用于归并:两个有序表放在同一数组的相邻位置上,arr[left]到arr[center-1]为第一个有序表,arr[center]到arr[right]是第二个有序表。每次从两端中取出一个进行比较,小的先放在一个temp数组,最后将比较剩下的直接放到temp中去,最后将temp又复制回arr。这是“治”。 所谓“分”,就是递归地将前半部分和后半部分的数据各自归并排序即可.
算法分析 。
每一趟归并的时间复杂度为O(n),共需要进行⌈log2n⌉趟。对应的算法的时间复杂度为O(nlog2n)。归并排序的空间复杂度O(n)。另外,归并排序中归并的算法并不会将相同关键字的元素改变相对次序,所以归并排序是稳定的。 二路归并排序的前提是两个序列本身有序.
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
69
70
71
72
73
74
|
void
Merger(
int
*arr,
int
len,
int
width)
{
int
*temp =(
int
*)
malloc
(
sizeof
(
int
) * (len));
//首先对两路下标分别进行初始化
int
l1 = 0;
int
h1 = l1 + width - 1;
int
l2 = h1 + 1;
int
h2 = l2 + width - 1 < len - 1 ? l2 + width - 1 : len - 1;
int
temppos = 0;
//判断所在下标位置的值
while
(l1 < len && l2 < len)
{
while
(l1 <= h1 && l2 <= h2)
{
if
(arr[l1] < arr[l2])
{
temp[temppos++] = arr[l1++];
}
else
{
temp[temppos++] = arr[l2++];
}
}
//l1有剩余
while
(l1 <= h1)
{
temp[temppos++] = arr[l1++];
}
//l2有剩余
while
(l2 <= h2)
{
temp[temppos++] = arr[l2++];
}
//l1 l2向后移动
l1 = h2 + 1;
h1 = (l1 + width - 1) < (len - 1) ? (l1 + width - 1) : (len - 1);
l2 = h1 + 1;
h2 = (l2 + width - 1) < (len - 1) ? (l2 + width - 1) : (len - 1);
}
//奇数归并块 剩下的一个单都块操作
while
(l1 <len)
{
temp[temppos++] = arr[l1++];
}
//用temp覆盖arr
for
(
int
i = 0; i < len ; ++i)
{
arr[i] = temp[i];
}
// free(temp);
}
void
MergeSort(
int
*arr,
int
len)
{
for
(
int
i = 1; i < len; i *= 2)
{
Merger(arr, len, i);
}
}
void
show(
int
*arr,
int
len)
{
for
(
int
i = 0; i < len; ++i)
{
cout << arr[i] <<
" "
;
}
}
int
main()
{
int
array[] = { 12, 51, 1, 36, 98, 21, 38, 47 };
int
len =
sizeof
(array) /
sizeof
(array[0]);
MergeSort(array, len);
show(array, len);
system
(
"pause"
);
return
0;
}
|
PS:二路合并排序算法 。
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
69
70
71
72
73
|
#include<iostream>
using
namespace
std;
class
SortableList
{
public
:
SortableList(
int
mSize)
{
maxSize = mSize;
l=
new
int
[maxSize];
n = 0;
}
~SortableList()
{
delete
[]l;
}
void
Merge(
int
,
int
,
int
);
void
MergeSort(
int
,
int
);
void
Input();
void
Output();
private
:
int
* l;
int
maxSize;
int
n;
};
void
SortableList::Input()
{
cout <<
"请输入要排序的数:"
;
for
(
int
i = 0; i <= maxSize - 1; i++)
cin >> l[i];
}
void
SortableList::Output()
{
cout <<
"排序后的数是:"
;
for
(
int
i = 0; i <= maxSize - 1; i++)
cout << l[i]<<
' '
;
}
void
SortableList::MergeSort(
int
left,
int
right)
{
if
(left < right)
//如果序列长度大于1则划分
{
int
mid = (left + right) / 2;
MergeSort(left, mid);
//对左序列进行排序
MergeSort(mid + 1, right);
//对右序列进行排序
Merge(left, mid, right);
//合并
}
}
void
SortableList::Merge(
int
left,
int
mid,
int
right)
{
int
* temp=
new
int
[right - left + 1];
int
i = left, j = mid + 1, k = 0;
while
((i <= mid) && (j <= right))
//判断序列是否为空
if
(l[i] <= l[j])
temp[k++] = l[i++];
else
temp[k++] = l[j++];
while
(i <= mid)
temp[k++] = l[i++];
//右序列空了左序列依次写入
while
(j <= right)
temp[k++] = l[j++];
//左序列空了右序列依次写入
for
(i = 0, k = left; k <= right;)
l[k++] = temp[i++];
//临时在数组temp中的排列好的数据放入数组l
}
int
main()
{
int
m;
cout <<
"请输入要排序的数的数目:"
;
cin >> m;
SortableList a1(m);
a1.Input();
a1.MergeSort(0, m-1);
a1.Output();
}
|
到此这篇关于c++实现二路归并排序的示例代码的文章就介绍到这了,更多相关c++ 二路归并排序内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。
原文链接:https://blog.csdn.net/qq_21230831/article/details/95733815 。
最后此篇关于c++实现二路归并排序的示例代码的文章就讲到这里了,如果你想了解更多关于c++实现二路归并排序的示例代码的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
粗略地说,单向数据绑定(bind)只是与 ng-model 绑定(bind)。当涉及 Controller 时,在页面内和 2-way 内。有人可以向我解释这个概念,以便我真正了解如何看待它吗?还有什
我想知道是否有任何替代 2 向 SSL 的方法。 2 向 SSL 是确保客户端和服务器可信通信的唯一选择吗?我有一个自签名证书供我的客户使用,我能否将自签名证书重新用于 2 种 SSL 方式,还是应该
如果是这样,你如何设置认证证书,你需要什么文件?是 .pfx 吗?您将如何在浏览器中安装它?一直试图通过浏览器测试 2 路 ssl。我有一个网络服务,尝试连接时总是返回认证身份验证失败。 最佳答案 扩
我希望能够对 XHTML 文档进行三向合并: 从文档的一些原始副本开始 一个用户编辑原始文档的副本 另一个用户编辑原始文档的单独副本 需要一个工具来合并(自动和/或可视化)两个用户所做的更改。 注意:
我有 4 张 table : ad (id, ...) website (id, title, URL, ...) space (id, website_id, ...) ad_space_count
我在 java 中有一个无状态服务,部署在 tomcat 网络服务器中,我还配置了 2 路 ssl 验证。到目前为止,一切正常。当我有一个新客户端时,我只需要将新客户端证书放入我的 trustore
我已经创建了一个带有证书的信任库和带有私钥的 keystore 。我已经放置了以下代码,加载了 trsustore 管理器和 keystore 管理器,然后创建了 SSL 上下文的实例。 每当我向网络
如果我在仅服务器身份验证中正确理解 SSL/TLS,握手后,服务器会向客户端发送它的公钥和由 CA 签名的数字签名证书。如果客户端有这个 CA 的公钥,它就可以解密证书并与服务器建立信任。如果它不信任
我有 Nginx,它使用双向 TLS 代理从客户端到 IBM DataPower 的请求。 从 Nginx 向 IBM DP 发送消息时出现错误:sll server (SERVER) ssl pee
我刚刚开始了一个项目,让我的雇主成为一个管理软件。我有一个琐碎但可能很简单的查询,我似乎找不到任何相关信息。 在对象之间建立“具有”关系的两种方式是否谨慎/良好做法。例如,Client 对象“有一个”
我在设置双向 SSL 身份验证时遇到问题。 我需要从 wso2 企业集成商访问 HTTPS 端点。 服务提供商给了我一个 pfx keystore ,其中包含我必须提供给服务器的证书和私钥。 我在我的
我正在为小型 PoC 构建 AWS Lambda 服务。 PoC 中的流程是: 通过 POST 获取(文本)输入, 执行小字符串操作 + 将操纵值存储到 DynamoDB 中,然后 通过 HTTP P
我的任务是在 Java 上下文中实现双向 TLS。我找到了一个示例 ( https://www.opencodez.com/java/implement-2-way-authentication-us
我正在尝试测试一个非常简单的双向 IM 应用程序。客户端在 android 上,服务器在我的 PC(java)上。我已经在 PC 到 PC 之间用 java 测试了这个应用程序,它工作正常。 但是在我
我有 java web 服务支持2-way ssl auth。所以我有客户端 keystore (client.p12),服务器证书在受信任的存储区中,服务器 keystore 中的客户端证书在受信任
通过 HTTPS 使用 Web 服务 我们有一个我们正在使用的网络服务。 Webservice 可以在 HTTP 和 HTTPS 协议(protocol)上运行。使用 HTTP 没问题,但如何使用 H
我在 Node.js 上有一个后端服务器,我正在尝试在 Nginx 和这个后端服务器之间设置 2 路 SSL。 但是我得到一个错误:2015/11/02 06:51:02 [错误] 12840#128
我一直在尝试连接到启用了 2 路 SSL 的服务端点。我正在使用 Spring resttemplate。我已将证书添加到 keystore 中,但出现以下错误: >org.springframewo
从 CherryPy 3.0 开始,只需指向服务器证书和私钥即可启用单向 SSL,如下所示: import cherrypy class HelloWorld(object): def ind
这个问题来自:MySQL Number of Days inside a DateRange, inside a month (Booking Table) 我有一个包含以下数据的表: CREATE
我是一名优秀的程序员,十分优秀!