发现自己算法的功底很差 这几天看MIT的算法导论课程 学习了一下归并算法 下面为代码 代码总体上不算是简介 尤其是拆数组的部分 其实可以是可以不拆直接在原数组上面操作的 但是由于归并部分的接口设计成了两个数组为参数 所以说不得不这样子实例化两个数组了~当然归并部分也可以直接写到排序里面 应该可以省下很多空间
class MergeSort
{
static void Main()
{
int[] sortnum = new int[] { 1, 23, 4, 32, 12, 58, 56, 36 , 76, 3, 24, 75, 35 };
sortnum = sort(sortnum);
for (int i = 0; i < sortnum.Length; i++)
{
Console.WriteLine(sortnum[i]);
}
Console.Read();
}
///排序部分 递归分组归并
public static int[] sort(int[] num)
{
int mid = num.Length / 2;
if (mid == 0)
{
return num;
}
int[] left = new int[mid];
for (int i = 0; i < mid; i++)
{
left[i] = num[i];
}
int[] right = new int[num.Length-mid];
for (int i = 0; i < right.Length; i++)
{
right[i] = num[i+mid];
}
return merge(sort(left),sort(right));
}
///归并部分
public static int[] merge(int[] left,int[] right)
{
int total = left.Length + right.Length;
int[] result = new int[total];
int ptleft = 0;
int ptright = 0;//两个指针,分别指向两个数组的头元素
for (int i = 0; i < total; i++)
{
if (ptleft < left.Length && ptright < right.Length)
{
result[i] = left[ptleft] < right[ptright] ? left[ptleft] : right[ptright];
if (left[ptleft] < right[ptright])
{
ptleft++;
}
else
{
ptright++;
}
}
else
{
break;
}
}
if (ptleft == left.Length)
{
for (int i = ptleft + ptright; i < total; i++)
{
result[i] = right[ptright];
ptright++;
}
}
else
{
for (int i = ptleft + ptright; i < total; i++)
{
result[i] = left[ptleft];
ptleft++;
}
}
return result;
}
}
}