博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
排序之归并排序详解
阅读量:4619 次
发布时间:2019-06-09

本文共 1673 字,大约阅读时间需要 5 分钟。

代码思路:

这里实现的是稳定的从小到大排序;

将需要排序的数组分为长度为gap的组(gap为1,2,4,····gap小于等于数组的总长度)

对于长度为gap的数组,对半分成两组(由于这两组是分组长度为gap/2时的分组,所以组内是有序的),将这两组使用merge()函数进行合并排序

对于末尾长度不足gap但大于gap/2的数组使用merge()函数合并排序,但是参数发生一定的变化

对于末尾长度小于或等于gap/2的分组,由于其组内是有序的,因此暂不予理会

循环到gap大于n时,跳出循环,判断是否有小于gap/2的分组,如果有,将其与等于gap/2的分组合

并排序

#include
#include
using namespace std;int a[100];void sort1(int *a, int n);int main(){ int n; while (cin >> n) { for (int i = 0; i < n; i++) cin >> a[i]; sort1(a, n); for (int i = 0; i < n; i++) cout << " " << a[i]; cout << endl; }}void merge(int *a, int s1, int e1, int e2){
//合并排序,s1,e1, e2分别为分组的开始坐标,中间坐标和结尾坐标 int i, j, k = 0; int *b = (int *)malloc((e2 - s1 + 1) * sizeof(int)); for (i = s1, j = e1 + 1; i <= e1 && j <= e2;) { if (a[i] > a[j]) { b[k++] = a[j]; j++; } else { b[k++] = a[i]; i++; } } while (i <= e1) { b[k++] = a[i]; i++; } while (j <= e2) { b[k++] = a[j]; j++; } for (i = s1, j = 0; i <= e2; i++, j++) { a[i] = b[j]; }}void sort1(int *a, int n){ int gap; for (gap = 1; gap <= n; gap *= 2) { int i; for (i = 1; i * gap - 1 < n; i++) { merge(a, (i - 1) * gap, (i - 1) * gap + gap / 2 - 1, i * gap - 1); } if (n % gap > gap / 2) { merge(a, (i - 1) * gap, (i - 1) * gap + gap / 2 - 1, n - 1); } } if (n % (gap / 2)) { merge(a, 0, gap / 2 - 1, n - 1); }}

 

转载于:https://www.cnblogs.com/denghui666/p/8436882.html

你可能感兴趣的文章
Spring3升级到Spring4时, 运行时出现找不到MappingJacksonHttpMessageConverter的情况
查看>>
详解缓冲区溢出攻击以及防范方法
查看>>
分布式事务解决方案(一) 2阶段提交 & 3阶段提交 & TCC
查看>>
android之网格布局和线性布局实现注册页面
查看>>
BZOJ 1014: [JSOI2008]火星人prefix( splay + hash )
查看>>
安装ejabberd2并配置MySQL为其数据库
查看>>
angular repeat
查看>>
android 图片圆角化控件
查看>>
java第三次作业
查看>>
HP Jack介绍
查看>>
敏捷软件开发(3)---COMMAND 模式 & Active Object 模式
查看>>
poj 1062 昂贵的聘礼 解题报告
查看>>
get the page name from url
查看>>
visual studio中csproj文件中的project guid改为小写 ( notepad++ 正则)
查看>>
TeeChart显示三维的图形,使用Surface
查看>>
如何使用 Idea 远程调试 Java 代码
查看>>
加密,解密
查看>>
在C#代码中应用Log4Net(一)简单使用Log4Net
查看>>
[转]如何写软件项目技术标
查看>>
每日站立会议个人博客五
查看>>