看了前面写的,貌似不是怎么清楚,用递归写了一次,
本质上两个数的交换,也是最小单位的序列归并,知道了这个就知道了递归的终点。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NUnit.Framework;
namespace zboTest
{
[TestFixture]
public class MergeSort
{
int[] buffer = { 5, 21, 6, 8, 9, 32, 13, 12, 41, 2, 3, 4 };
[Test]
public void TestSort()
{
DoMergeSort(0, buffer.Length - 1);
PrintAll(buffer);
}
private void PrintAll(int[] buffer)
{
for (int i = 0; i < buffer.Length; i++)
{
Console.Write(buffer[i] + ", ");
}
}
private void DoMergeSort(int start, int end)
{
if (end == start + 1)
{
if (buffer[start] > buffer[end])
{
Swap(start, end);
}
}
else
{
int mid = (end + start) / 2;
DoMergeSort(start, mid);
DoMergeSort(mid, end);
MergeTwoLists(start, mid, end);
}
}
private void MergeTwoLists(int start, int mid, int end)
{
int leftSentry = start;
int rightSentry = mid;
while (leftSentry < mid && rightSentry < end)
{
if (buffer[leftSentry] > buffer[rightSentry])
{
MoveBackToFront(leftSentry, rightSentry);
leftSentry++;
rightSentry++;
}
else { leftSentry++; }
}
}
private void MoveBackToFront(int leftSentry, int rightSentry)
{
int tmp = buffer[rightSentry];
for (int i = rightSentry; i > leftSentry; i--)
{
buffer[i] = buffer[i-1];
}
buffer[leftSentry] = tmp;
}
private void Swap(int leftSentry, int rightSentry)
{
int tmp = buffer[leftSentry];
buffer[leftSentry] = buffer[rightSentry];
buffer[rightSentry] = tmp;
}
}
}