1.需求:将一个数组通过归并排序排成有序数组
2.思想:归并排序是分治法的一个典型应用,将两个有序的序列合并成一个有序的序列称为归并,归并排序,通过将数组分成若干个有序的序列,当拆分成只有一个数时认为是有序的,然后将这些序列归并。这里需要用到递归。
3.实现:
public class MSort
{
/// <summary>
/// 待排序数组
/// </summary>
public int[] arr { get; set; }
/// <summary>
/// 归并排序
/// </summary>
/// <param name="left">指向需归并操作数组的左边界</param>
/// <param name="right">指向需归并操作数组的右边界</param>
public void MergeSort(int left,int right)
{
if (left < right)
{
int mid = (left + right) / 2;
MergeSort(left, mid);
MergeSort(mid + 1, right);
Merge(left,mid,right);
}
}
public void Merge(int left,int mid,int right)
{
int[] temparr = new int[right - left + 1];
int i = left;
int j = mid + 1;
int k = 0;
while (i <= mid && j <= right)
{
if (arr[i] < arr[j])
{
temparr[k] = arr[i];
i++;
}
else
{
temparr[k] = arr[j];
j++;
}
k++;
}
if (i <= mid)
{
for (int m = i; m <= mid; m++,k++)
temparr[k] = arr[m];
}
if (j <= right)
{
for (int m = j; m <= right; m++, k++)
temparr[k] = arr[m];
}
for (int n = 0; n < temparr.Length; n++)
{
arr[left + n] = temparr[n];
}
}
}
4.测试代码:
MSort m = new MSort();
m.arr = new int[] { 43, 32, 212, 33, 56, 43, 68, 32, 46, 78, 6 };
m.MergeSort(0, m.arr.Length - 1);
for (int i = 0; i < m.arr.Length - 1; i++)
{
Console.Write(m.arr[i] + " ");
}
Console.Write("\n");
5.运行结果:
6.总结:归并排序为时间复杂度O(nlogn)