基础排序之归并排序

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()函数。

主函数步骤: 

  1. 求中间点
  2. 左半边进行归并排序
  3. 右半边进行归并排序
  4. 进行合并操作

合并函数:

  1. 申请大小为 end-start+1的空间
  2. p指向tmp数组的第0个位置
  3. l指向左边数组第0个位置
  4. r指向右边数组第0个位置
  5. 从小到大一次放入tmp数组
  6. 处理左边数组还有剩余
  7. 处理右边数组还有剩余
  8. 将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]    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值