using System;
public class Program
{
// 归并排序
public static void MergeSort(int[] nums, int start, int end){
if(start >= end) return;
int mid = start + (end - start)/2; // 求中间点
MergeSort(nums,start,mid); // 左半边
MergeSort(nums,mid+1,end); // 右半边
Merge(nums,start, mid, end); // 进行合并操作
}
public static void Merge(int[] nums, int start, int mid, int end){
int[] tmp = new int[end-start+1]; // 申请大小为 end-start+1的空间
int p=0; // p指向tmp数组的第0个位置
int l = start; // l指向左边数组第0个位置
int r = mid+1; // r指向右边数组第0个位置
while(l<=mid && r<=end){ // 从小到大一次放入tmp数组
if(nums[l]<= nums[r]){
tmp[p] = nums[l];
p++;
l++;
}else{
tmp[p] = nums[r];
p++;
r++;
}
}
while(l<=mid){ // 左边数组还有剩余
tmp[p] = nums[l];
p++;
l++;
}
while(r<=end){ // 右边数组还有剩余
tmp[p] = nums[r];
p++;
r++;
}
for(int i=start; i <= end;i++){ // 将tmp中的数据依次放入 nums 数组中
nums[i] = tmp[i-start];
}
}
public static void Main()
{
int[] nums = new int[]{4,5,7,2,3,1,6};
MergeSort(nums,0, nums.Length-1);
Console.WriteLine(string.Join(",",nums));
}
}
归并排序也是比较容易理解的,归并排序采用了分治的思想,把待数组分成左右两部分并对子问题进行排序。代码量最多的地方是Merge()函数。
主函数步骤:
- 求中间点
- 左半边进行归并排序
- 右半边进行归并排序
- 进行合并操作
合并函数:
- 申请大小为 end-start+1的空间
- p指向tmp数组的第0个位置
- l指向左边数组第0个位置
- r指向右边数组第0个位置
- 从小到大一次放入tmp数组
- 处理左边数组还有剩余
- 处理右边数组还有剩余
- 将tmp中的数据依次放入 nums 数组中
[4,5,7,2,3,1,6]
4,5,7,2,3,1,6
mid
[4,5,7,2] stack1
mid
[4,5] [7,2] stack12
[4] [5] stack13
[4,5] stack13
[7] [2] stack23
[2,7] stack23
[2,4,5,7] stack12
右边[1,3,6]
合并之后的数组:[1,2,3,4,5,6]