#include "stdafx.h"
#include <iostream>
#define DATA_SIZE 14
void merging(int *pList1, int list1_size, int *pList2, int list2_size)
{
int i = 0;
int j = 0;
int k = 0;
int m = 0;
int temp[DATA_SIZE];
while ( i < list1_size && j < list2_size )
{
if ( pList1[i] < pList2[j] )
{
temp[k++] = pList1[i++];
}
else
{
temp[k++] = pList2[j++];
}
}
while ( i < list1_size )
{
temp[k++] = pList1[i++];
}
while ( j < list2_size )
{
temp[k++] = pList2[j++];
}
for ( m = 0; m < (list1_size + list2_size); m++)
{
pList1[m] = temp[m];
}
}
void mergeSort1(int data[], int iDataSize)
{
if ( iDataSize > 1 )
{
int *pList1 = data;
int list1_size = iDataSize / 2;
int *pList2 = data + iDataSize / 2;
int list2_size = iDataSize - list1_size;
mergeSort1(pList1, list1_size);
mergeSort1(pList2, list2_size);
merging(pList1, list1_size, pList2, list2_size);
}
}
void mergeSort2(int data[], int iDataSize)
{
int i = 0;
int iNext = 0;
int iLeft_min = 0;
int iLeft_max = 0;
int iRight_min = 0;
int iRight_max = 0;
int *pTemp = (int *)malloc(iDataSize * sizeof(int));
for ( i = 1; i < iDataSize; i *= 2 )
{
for ( iLeft_min = 0; iLeft_min < iDataSize - i; iLeft_min = iRight_max )
{
iRight_min = iLeft_min + i;
iLeft_max = iLeft_min + i;
iRight_max = iLeft_max + i;
if ( iRight_max > iDataSize )
{
iRight_max = iDataSize;
}
iNext = 0;
while ( iLeft_min < iLeft_max && iRight_min < iRight_max )
{
if ( data[iLeft_min] < data[iRight_min] )
{
pTemp[iNext++] = data[iLeft_min++];
}
else
{
pTemp[iNext++] = data[iRight_min++];
}
}
while ( iLeft_min < iLeft_max )
{
data[--iRight_min] = data[--iLeft_max];
}
while ( iNext > 0 )
{
data[--iRight_min] = pTemp[--iNext];
}
}
}
free(pTemp);
}
void printResult(int data[], int iDataSize)
{
printf("排序后的结果是:");
for ( int i = 0; i < iDataSize; i++)
{
printf("%d ", data[i]);
}
printf("\n\n");
}
//归并排序--递归实现
void mergeSort_recursive()
{
int data[DATA_SIZE] = {3,6,1,4,2,5,9,33,8,1,22,32,11,18};
mergeSort1(data, DATA_SIZE);
printResult(data, DATA_SIZE);
}