归并排序的主要算法为将两段有序数据合并为一段有序数据,通过递归调用的方式可以实现归并排序。
归并排序的复杂度为6NlogN
using System;
using System.Collections.Generic;
public class Sort_Merge
{
/// <summary>
/// 归并排序
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="v"></param>
public static void Sort<T>(List<T> v) where T : IComparable
{
List<T> w = new List<T>(v.Count);
T a = default(T);
for (int i = 0; i < v.Count; i++)
{
w.Add(a);
}
Sort<T>(v,w, 0, v.Count - 1);
}
/// <summary>
/// 递归调用
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="v"></param>
/// <param name="w"></param>
/// <param name="lo"></param>
/// <param name="hi"></param>
public static void Sort<T>(List<T> v, List<T> w, int lo, int hi) where T : IComparable
{
if (lo >= hi)
return;
int mid = (hi + lo) / 2;
Sort<T>(v, w,lo, mid);
Sort<T>(v, w,mid + 1, hi);
Merge<T>(v,w, lo, mid, hi);
return;
}
/// <summary>
/// 合并两段已排序数据
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="v"></param>
/// <param name="w"></param>
/// <param name="lo"></param>
/// <param name="mid"></param>
/// <param name="hi"></param>
public static void Merge<T>(List<T> v, List<T> w, int lo,int mid, int hi) where T:IComparable
{
//两段, a[lo]...a[mid], a[mid+1]...a[hi]
for (int k = lo; k <= hi; k++)
{
w[k] = v[k];
}
int i = lo;
int j = mid + 1;
for (int k = lo; k <= hi; k++)
{
if (i > mid)
{
v[k] = w[j++];
}
else if (j > hi)
{
v[k] = w[i++];
}
else if (w[i].CompareTo(w[j]) < 0)
{
v[k] = w[i++];
}
else
{
v[k] = w[j++];
}
}
}
}
代码主要分为三部分,一部分是主要排序函数sort,递归排序的一种方式是采用辅助数组的方式,此函数定义了辅助数组,防止每次递归调用申请新的数组,第二部分是递归sort,左右两部分分别排序,然后通过merge函数合并。