本文实例讲述了C++实现自底向上的归并排序算法。分享给大家供大家参考,具体如下:
一. 算法描述
自底向上的归并排序:归并排序主要是完成将若干个有序子序列合并成一个完整的有序子序列;自底向上的排序是归并排序的一种实现方式,将一个无序的N长数组切个成N个有序子序列,然后再两两合并,然后再将合并后的N/2(或者N/2 + 1)个子序列继续进行两两合并,以此类推得到一个完整的有序数组。下图详细的分解了自底向上的合并算法的实现过程:
二. 算法实现
?
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
|
/*=============================================================================
#
# FileName: mergeSort.c
# Algorithm: 归并排序(自底向上)
# Author: Knife
# Created: 2014-06-14 16:40:02
#
=============================================================================*/
#include<stdio.h>
#include<stdlib.h>
void merge_sort( int * intArr, int intArr_len);
void merge_array( int * intArr1, int len1, int * intArr2, int len2);
void main(){
int intArr[] = {8,3,6,4,2,9,5,4,1,7};
int n = sizeof (intArr) / sizeof (intArr[0]);
int i = 0;
merge_sort(intArr, n);
for (;i<n;i++){
printf ( "%d " ,intArr[i]);
}
printf ( "\\n" );
}
//归并排序(自底向上)
void merge_sort( int * intArr, int intArr_len){
int len = 1;
int k = 0;
while (len < intArr_len) {
int i = 0;
for (; i + 2*len <= intArr_len; i += 2*len){
int * intArr1 = intArr + i;
int intArr1_len = len;
int * intArr2 = intArr + i + len;
int intArr2_len = len;
merge_array(intArr1, intArr1_len, intArr2, intArr2_len);
}
if (i + len <= intArr_len){
int * intArr1 = intArr + i;
int intArr1_len = len;
int * intArr2 = intArr + i + len;
int intArr2_len = intArr_len - i - len;
merge_array( intArr1, intArr1_len, intArr2, intArr2_len);
}
len *= 2; //有序子序列长度*2
}
}
//合并两个数组,并排序
void merge_array( int * intArr1, int len1, int * intArr2, int len2){
//申请分配空间
int * list = ( int *) malloc ((len1+len2) * sizeof ( int ));
int i = 0, j = 0, k = 0;
while (i < len1 && j < len2){
// 把较小的那个数据放到结果数组里, 同时移动指针
list[k++] = (intArr1[i] < intArr2[j]) ? intArr1[i++] : intArr2[j++];
}
// 如果 intArr1 还有元素,把剩下的数据直接放到结果数组
while (i < len1){
list[k++] = intArr1[i++];
}
// 如果 intArr2 还有元素,把剩下的数据直接放到结果数组
while (j < len2){
list[k++] = intArr2[j++];
}
// 把结果数组 copy 到 intArr1 里
for (i = 0; i < k; i++){
intArr1[i] = list[i];
}
//释放申请的空间
free (list);
}
|
相关文章
猜你喜欢
- 64M VPS建站:能否支持高流量网站运行? 2025-06-10
- 64M VPS建站:怎样选择合适的域名和SSL证书? 2025-06-10
- 64M VPS建站:怎样优化以提高网站加载速度? 2025-06-10
- 64M VPS建站:是否适合初学者操作和管理? 2025-06-10
- ASP.NET自助建站系统中的用户注册和登录功能定制方法 2025-06-10
TA的动态
- 2025-07-10 怎样使用阿里云的安全工具进行服务器漏洞扫描和修复?
- 2025-07-10 怎样使用命令行工具优化Linux云服务器的Ping性能?
- 2025-07-10 怎样使用Xshell连接华为云服务器,实现高效远程管理?
- 2025-07-10 怎样利用云服务器D盘搭建稳定、高效的网站托管环境?
- 2025-07-10 怎样使用阿里云的安全组功能来增强服务器防火墙的安全性?
快网idc优惠网
QQ交流群
您的支持,是我们最大的动力!
热门文章
-
2025-05-26 79
-
2025-05-24 65
-
详解PHP中instanceof关键字及instanceof关键字有什么作用
2025-05-29 55 -
2025-05-29 42
-
2025-06-04 65
热门评论