#include<stdio.h>
#define length 7
/*
将待排序元素分成大小大致相同的2个子集合,分别对2个子集合进行排序。最终将排好序的子集合
合并为所要求的排好序的集合。
*/
void merge(int ar_c[], int ar_d[length], int left, int middle, int right )
{
int left_left = left, left_right = middle;
int right_left = middle + 1, right_right = right;
int k = left;
while ((left_left <= left_right) && (right_left <= right_right))
{
if (ar_c[left_left] <= ar_c[right_left])
{
ar_d[k] = ar_c[left_left];
k++;
left_left++;
}
else
{
ar_d[k] = ar_c[right_left];
k++;
right_left++;
}
}
if (left_left > left_right)
{
for (int q = right_left; q <= right_right; q++,k++)
{
ar_d[k] = ar_c[q];
}
}
else
{
for (int q = left_left; q <= left_right; q++,k++)
{
ar_d[k] = ar_c[q];
}
}
}
void mergePass(int ar_x[], int ar_y[], int s)
{
int i = 0;
while (i <= length - 2 * s)
{
merge(ar_x, ar_y, i, i + s - 1, i + 2 * s - 1);
i = i + 2 * s;
}
if (i + s < length)
{
merge(ar_x, ar_y, i, i + s - 1, length - 1);
}
else
{
for (int j = i; j < length; j++)
{
ar_y[j] = ar_x[j];
}
}
}
void mergeSort(int ar_a[])
{
if (ar_a == NULL || length < 2)
{
printf("数组不符合排序\n");
return;
}
int ar_b[length];
int s = 1;
while (s < length)
{
mergePass(ar_a, ar_b, s);
s += s;
mergePass(ar_b,ar_a, s);
s += s;
}
}
void Print(int ar_a[])
{
for (int i = 0; i < length; i++)
{
printf("%d ", ar_a[i]);
}
return;
}
int main()
{
int ar_a[length] = { 32,12,56,78,76,45,36 };
int left = 0, right = length-1, middle = (left + right) / 2;
printf("before sorting:\n\t");
Print(ar_a);
mergeSort(ar_a);
printf("\nafter sorting:\n\t");
Print(ar_a);
return 0;
}