#include "stdafx.h"
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
//合并两段已经排好序的列表
void merge(int list[] ,int mergelist[] , int left , int mid , int right)
{
int i = left;
int j = mid + 1;
int k = left;
while( i <= mid && j <= right)
{
//从左往右按顺序检查两个子列表,将最小的存放到mergelist
if (list[i] < list[j])
{
mergelist[k++] = list[i++];
}
else
{
mergelist[k++] = list[j++];
}
}
if (i<=mid)
{
//如果右边子列表已存放完毕,则继续将左边剩下的数据存放到mergelist
for(; i <= mid; i++)
mergelist[k++] = list[i];
}
else
{
//如果左边子列表已存放完毕,则继续将右边边剩下的数据存放到mergelist
for (; j <= right; j++)
{
mergelist[k++] = list[j];
}
}
}
//将列表list按照seglen分段排序,并将结果存放到mergelist
void MergePass(int list[] , int mergelist[] , const int size, const int seglen)
{
int i = 0;
while( i + 2*seglen <= size)
{
//当两段都达到seglen长度时,调用merge
merge(list,mergelist, i, i+seglen -1, i + 2*seglen -1);
i += 2*seglen;
}
if (i + seglen <= size - 1)
{
//一长一短
merge(list,mergelist, i, i+seglen -1, size - 1);
}
else
{
for ( ; i <= size -1 ; i++)
{
mergelist[i] = list[i];
}
}
}
#define MAX_SIZE 1000
void MergeSort(int list[], int size)
{
int seglen = 1;
int tmplist[MAX_SIZE];
while(seglen < size)
{
MergePass(list,tmplist,size,seglen);
seglen *= 2;
if (seglen >= size)
{
for ( int i = 0; i< size ; i++)
{
list[i] = tmplist[i];
}
}
else
{
MergePass(tmplist,list,size,seglen);
seglen *= 2;
}
}
}
int _tmain(int argc, _TCHAR* argv[])
{
srand( (unsigned)time( NULL ) );
const int size = 8;
int array[size];
printf("rand number:/n");
for ( int i = 0; i < size ; i++)
{
array[i] = rand()%1000;
printf("%d ", array[i]);
}
printf("/nafter merge sort:/n");
MergeSort(array,size);
for ( int i = 0; i < size ; i++)
{
printf("%d ", array[i]);
}
printf("/n");
return 0;
}