您的位置:首页 > 其它

外部排序-合并排序

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: