开发工具 Visual Studio
开发语言 C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace MergeSortTest
{
class Program
{
static void Main(string[] args)
{
int[] R = new int[] { 75, 87, 68, 92, 88, 61, 77, 96, 80, 72 };
Console.Write("排序前:");
Printf(R);
MergeSort(R);
Console.WriteLine();
Console.Write("排序后:");
Printf(R);
Console.Read();
}
static void Printf(int[] R)
{
for (int i = 0; i < R.Length; i++)
Console.Write(R[i]+" ");
}
//一次归并,将两个有序表归并为一个有序表
static void Merge(int[] R, int low, int mid, int high)
{
int[] R1 = new int[R.Length];
int i = low, j = mid + 1, k = 0;
while(i<=mid && j<=high){
if(R[i] <= R[j]){
R1[k] = R[i];
i++; k++;
}else{
R1[k] = R[j];
j++; k++;
}
}
while(i<=mid){
R1[k] = R[i];
i++; k++;
}
while (j <= high)
{
R1[k] = R[j];
j++; k++;
}
for (k = 0, i = low; i <= high; k++, i++)
R[i] = R1[k];
}
//一趟归并
static void MergePass(int[] R, int length)
{
int n = R.Length;
int i;
//归并length长的两个相邻子表
for (i = 0; i + 2 * length - 1 < n; i = i + 2 * length)
Merge(R, i, i+length-1, n-1);
//余下两个子表,后者长度小于length
if (i + length - 1 < n)
Merge(R, i, i+length-1, n-1);//归并这两个子表
}
//二路归并排序
static void MergeSort(int[] R)
{
int n = R.Length;
int length;
for (length = 1; length < n; length = 2 * length)
MergePass(R, length);
}
}
}
运行结果