static void Merging_Sort(int[] a) //归并排序算法
{
int[] Temp=new int[a.Length];
MSort(a,Temp,0,a.Length-1);
}
static void MSort(int[] Source, int[] Temp, int start, int end)
{
if (start < end) //拆分到只有一个元素为止,这时可认为这个数组是有序的,因为只有一个元素
{
int middle = (start + end) / 2; //取数组的中间位
MSort(Source, Temp, start, middle); //拆分左半部分
MSort(Source, Temp, middle + 1, end); //拆分右半部分
Merge(Source, Temp, start, middle, end); //将拆分后的元素合并到结果数组并,并在插入时排序
}
}
static void Merge(int[] Source, int[] Temp, int start, int middle, int end) //合并Source数组,合并时排序,排序后的结果输出到Temp数组
{
int i = start;
int j = middle + 1;
int k = 0;
while (i <= middle && j <= end)
{
if(Source[i] <= Source[j]) //取左半边和右半边比较,取较小值写入数组
Temp[k++] = Source[i++];
else
Temp[k++] = Source[j++];
}
while(i <= middle) //将左半边剩余元素写入数组
Temp[k++] = Source[i++];
while(j <= end) //将右半边剩余元素写入数组
Temp[k++] = Source[j++];
for (i = 0; i < k; i++)
{
Source[start + i] = Temp[i]; //注意是start+i,不是每次都从0位置开始写入的,要从start开始写入
}
}