外部排序-合并排序
2015-11-29 17:32
543 查看
定义省略:
code:
#include <stdio.h>
void MergeTwo(int *src, int *dst, int left, int middle, int n)
{
int i, j, k, t;
i = left;
k = left;
j = middle + 1;
while ( (i <= middle) && (j <= n) )
{
if (src[i] <= src[j])
{
dst[k] = src[i];
i++;
}
else
{
dst[k] = src[j];
j++;
}
k++;
}
if (i > middle)
{
for (t = j; t <= n; t++)
dst[k + t - j] = src[t];
}
else
{
for (t = i; t <= middle; t++)
dst[k + t - i] = src[t];
}
}
void MergeAll(int *src, int *dst, int length, int step)
{
int i = 0, t = 0;
while (i <= (length - 2*step + 1))
{
MergeTwo(src, dst, i, i + step - 1, i + 2 * step - 1);
i = i + 2 * step;
}
if (i + step -1 < length)
{
MergeTwo(src, dst, i, i + step - 1, length);
}
else
{
for(t = i; t <= length; t++)
dst[t] = src[t];
}
for(t = 0; t <= length; t++)
src[t] = dst[t];
printf("current sorting result : ");
for (i = 0; i <= length; i++)
printf("%d ", dst[i]);
printf("\n");
}
int main(int argc, char* argv[])
{
int i;
int list[] = {1,3,89,3,5,67,25,88,55,43,7,9,10};
int length = sizeof(list)/sizeof(list[0]);
int list2[] = {1,3,89,3,5,67,25,88,55,43,7,9,10};
int step = 1;
int count = length - 1;
while(step < length)
{
printf("Merge length = %d\n", step);
MergeAll(list, list2, count, step);
step = 2*step;
if (step < length)
{
printf("Merge length = %d\n", step);
MergeAll(list2, list, count, step);
step = 2 * step;
}
}
//
printf("\nThe final result is : \n");
for(i = 0; i < length; i++)
printf("%d ", list[i]);
printf("\n");
return 0;
}
code:
#include <stdio.h>
void MergeTwo(int *src, int *dst, int left, int middle, int n)
{
int i, j, k, t;
i = left;
k = left;
j = middle + 1;
while ( (i <= middle) && (j <= n) )
{
if (src[i] <= src[j])
{
dst[k] = src[i];
i++;
}
else
{
dst[k] = src[j];
j++;
}
k++;
}
if (i > middle)
{
for (t = j; t <= n; t++)
dst[k + t - j] = src[t];
}
else
{
for (t = i; t <= middle; t++)
dst[k + t - i] = src[t];
}
}
void MergeAll(int *src, int *dst, int length, int step)
{
int i = 0, t = 0;
while (i <= (length - 2*step + 1))
{
MergeTwo(src, dst, i, i + step - 1, i + 2 * step - 1);
i = i + 2 * step;
}
if (i + step -1 < length)
{
MergeTwo(src, dst, i, i + step - 1, length);
}
else
{
for(t = i; t <= length; t++)
dst[t] = src[t];
}
for(t = 0; t <= length; t++)
src[t] = dst[t];
printf("current sorting result : ");
for (i = 0; i <= length; i++)
printf("%d ", dst[i]);
printf("\n");
}
int main(int argc, char* argv[])
{
int i;
int list[] = {1,3,89,3,5,67,25,88,55,43,7,9,10};
int length = sizeof(list)/sizeof(list[0]);
int list2[] = {1,3,89,3,5,67,25,88,55,43,7,9,10};
int step = 1;
int count = length - 1;
while(step < length)
{
printf("Merge length = %d\n", step);
MergeAll(list, list2, count, step);
step = 2*step;
if (step < length)
{
printf("Merge length = %d\n", step);
MergeAll(list2, list, count, step);
step = 2 * step;
}
}
//
printf("\nThe final result is : \n");
for(i = 0; i < length; i++)
printf("%d ", list[i]);
printf("\n");
return 0;
}
相关文章推荐
- 感知机介绍及实现
- hdu 5585 Numbers
- 感知机介绍及实现
- hdu1995--汉诺塔V
- fleet - 基于Machine Metadata的任务调度
- Lua封装增加CCLabel接口
- 使用openshit在ubuntu14.04下一键部署openstack(juno版本)
- 全新 Mac 安装指南(编程篇)(环境变量、Shell 终端、SSH 远程连接)
- 五大常用算法
- Bootstrap 教程 之 Less 入门文档
- Android中的ExpandableListView的使用,以及点击时间禁用,并展开group,去掉小三角
- SLAM 网址汇总
- Android最火的快速开发框架AndroidAnnotations使用详解
- 信息安全系统设计基础第十二周学习总结
- 视频里人流跟踪统计 Counting People by Tracking in Video
- 关于js中“=”,“==”,“===”三者的去呗
- 使用BufferedReader和BufferedWriter复制文件时遇到的一点问题
- 3D中的OBJ文件格式详解
- 汇编中的10H中断int 10h详细说明
- UIWindow简单介绍