归并排序算法【归并排序】C代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void arrPrintf(int* data, int length)
{
for (size_t i = 0; i < length; i++)
{
if (i == length - 1)
printf("%2d\n", data[i]);
else
printf("%2d, ", data[i]);
}
}
void swap(int* data, int i, int j)
{
int temp = data[i];
data[i] = data[j];
data[j] = temp;
}
void _mergeSort(int* data, int left, int right, int* tmp)
{
static int index = 0;
if (left == right) return;
index++;
printf(" [Index : %2d] ", index);
int mid = (left + right) / 2;
for (int i = left; i <= right; i++)
{
if (i == left)
printf("{ %2d, ", data[i]);
else if (i == right)
printf("%2d }\n", data[i]);
else
printf("%2d, ", data[i]);
}
_mergeSort(data, left, mid, tmp);
_mergeSort(data, mid + 1, right, tmp);
int begin1 = left, end1 = mid;
int begin2 = mid + 1, end2 = right;
int i = left;
while (begin1 <= end1 && begin2 <= end2)
{
if (data[begin1] < data[begin2])
{
tmp[i++] = data[begin1++];
}
else
{
tmp[i++] = data[begin2++];
}
}
while (begin1 <= end1)
{
tmp[i++] = data[begin1++];
}
while (begin2 <= end2)
{
tmp[i++] = data[begin2++];
}
memcpy(data + left, tmp + left, sizeof(int) * (right - left + 1));
for (int i = left; i <= right; i++)
{
if (i == left)
printf("【 %2d, ", data[i]);
else if (i == right)
printf("%2d 】\n", data[i]);
else
printf("%2d, ", data[i]);
}
}
void mergeSort(int* data, int length)
{
int* tmp = (int*)malloc(sizeof(int) * length);
if (tmp == NULL)
{
printf("malloc err!");
return;
}
_mergeSort(data, 0, length - 1, tmp);
free(tmp);
tmp = NULL;
}
int main()
{
printf("归并排序算法\n");
int data[] = { 2,5,29,15,39,98,41,3,55,55,20,78,18,88 };
arrPrintf(data, sizeof(data) / sizeof(data[0]));
mergeSort(data, sizeof(data) / sizeof(data[0]));
arrPrintf(data, sizeof(data) / sizeof(data[0]));
return 0;
}