1. 程式人生 > >Algorithm--歸併排序

Algorithm--歸併排序

#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);
}