问题描述:
设子数组a[0:k]和a[k+1:n-1]已经排好序(0<=k<=n-1)。
设计一个合并这两个数组为排好序的数组a[0:n-1]。
要求算法在最坏情况下所用的计算时间为O(n),且只用到O(1)的辅助空间。
#include<stdio.h>
#include<assert.h>
#define length 7
void Move_right(int* ar_a, int left_left, int right_left)
{
int temp = ar_a[right_left];
for (int j = right_left; j >left_left ; j--)
{
ar_a[j] = ar_a[j - 1];
}
ar_a[left_left] = temp;
}
void merge(int *ar_c, int left, int middle, int right)
{
int left_left = left, left_right = middle;
int right_left = middle + 1, right_right = right;
while ((left_left <= left_right) && (right_left <= right_right))
{
if (ar_c[left_left] > ar_c[right_left]) //向后移动
{
Move_right(ar_c,left_left,right_left);
left_left++;
right_left++;
left_right++;
}
else
{
left_left++;
}
}
}
void mergePass(int *ar_x, int s)
{
int i = 0;
while (i <= length - 2 * s)
{
merge(ar_x, i, i + s - 1, i + 2 * s - 1);
i = i + 2 * s;
}
if (i + s < length)
{
merge(ar_x, i, i + s - 1, length - 1);
}
}
void mergeSort(int *ar_a)
{
assert(ar_a != NULL || length >= 2);
int s = 1;
while (s < length)
{
mergePass(ar_a, s);
s += s;
}
}
void Print(int *ar_a)
{
assert(ar_a != NULL || length > 0);
for (int i = 0; i < length; i++)
{
printf("%d ", ar_a[i]);
}
return;
}
int main()
{
int ar_a[length] = { 50,38,65,22,76,13,27 };
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;
}