基本原理:
归并排序分成两部分:
- 基本排序规则,左右元素进行比较,依次放入新数组中,一侧没有另一侧直接放入新数组;
- 递归平分数组,不停分割数组,长度小于2时停止平分,从最小长度的数组开始比较,一层一层向上比较。
代码实现:
int[] array = {1, 6, 9, 11, 8, 2, 7, 5, 3, 10, 4};
for (int i = 0; i < array.Length; i++)
{
Console.WriteLine(array[i]);
}
//1. 基本排序规则,左右元素进行比较,依次放入新数组中,一侧没有另一侧直接放入新数组;
static int[] Sort(int[] left, int[] right)
{
//准备一个新数组
int[] arrayNew = new int[left.Length + right.Length];
int leftIndex = 0;
int rightIndex = 0;
//填满这个新数组
for (int i = 0; i < arrayNew.Length; i++)
{
if (left[i] >= left.Length)
{
arrayNew[i] = right[rightIndex];
rightIndex++;
}
else if(rightIndex >= right.Length)
{
arrayNew[i] = left[leftIndex];
leftIndex++;
}
else if (left[leftIndex] < right[rightIndex])
{
arrayNew[i] = left[leftIndex];
leftIndex++;
}
else
{
arrayNew[i] = right[rightIndex];
rightIndex++;
}
}
return arrayNew;
}
//2. 递归平分数组,不停分割数组,长度小于2时停止平分,从最小长度的数组开始比较,一层一层向上比较。
static int[] Merge(int[] array)
{
//递归结束条件
if(array.Length < 2) { return array; }
//1. 数组分两段,得到中间索引
int mid = array.Length / 2;
//2. 初始化左右数组
int[] left = new int[mid];
int[] right = new int[array.Length - mid];
//左右初始化左右数组内容
for (int i = 0;i < array.Length;i++)
{
if(i < mid)
{
left[i] = array[i];
}
else
{
right[i - mid] = array[i];
}
}
return Sort(Merge(left), Merge(right));
}
Merge(array);
for (int i = 0; i < array.Length; i++)
{
Console.WriteLine(array[i]);
}