伪代码
MERGE(A, p, q, r)
n1 = q - p + 1
n2 = r - q
let L[1 .. n1] and R[1 .. n2] be new arrays
for i = 1 to n1
L[i] = A[p + i - 1]
for j = 1 to n2
R[j] = A[q + j]
i = 1
j = 1
for k = p to r
if L[i] <= R[j]
A[k] = L[i]
i = i + 1
else
A[k] = R[j]
j = j + 1
MERGE-SOFT(A, p, r)
if p < r
q = (p + r) / 2
MERGE-SORT(A, p, q)
MERGE-SOFT(A, q + 1, r)
MERGE(A, p, q, r)
c#代码
static void MergeSort(int[] array, int firstIndex, int lastIndex)
{
if (firstIndex < lastIndex)
{
int middleIndex = (firstIndex + lastIndex) / 2;
MergeSort(array, firstIndex, middleIndex);
MergeSort(array, middleIndex + 1, lastIndex);
Merge(array, firstIndex, middleIndex, lastIndex);
}
}
static void Merge(int[] array, int firstIndex, int middleIndex, int lastIndex)
{
int prevLength = middleIndex - firstIndex + 1;
int nextLength = lastIndex - middleIndex;
int[] prevArray = new int[prevLength];
int[] nextArray = new int[nextLength];
int i;
int j;
for (i = 0; i < prevLength; i++)
{
prevArray[i] = array[firstIndex + i];
}
for (j = 0; j < nextLength; j++)
{
nextArray[j] = array[middleIndex + 1 + j];
}
i = 0;
j = 0;
int k = 0;
while (k < lastIndex - firstIndex + 1)
{
if (prevArray[i] <= nextArray[j])
{
array[firstIndex + k] = prevArray[i++];
}
else
{
array[firstIndex + k] = nextArray[j++];
}
k++;
if (i == prevLength || j == nextLength)
{
break;
}
}
while (i < prevLength)
{
array[firstIndex + k] = prevArray[i++];
k++;
}
while (j < nextLength)
{
array[firstIndex + k] = nextArray[j++];
k++;
}
}