【无标题】归并排序 Merge Sort

基本原理

归并排序分成两部分:

  1. 基本排序规则,左右元素进行比较,依次放入新数组中,一侧没有另一侧直接放入新数组;
  2. 递归平分数组,不停分割数组,长度小于2时停止平分,从最小长度的数组开始比较,一层一层向上比较。

代码实现

int[] array = {1, 6, 9, 11, 8, 2, 7, 5, 3, 10, 4};
for (int i = 0; i < array.Length; i++)
{
    Console.WriteLine(array[i]);
}
//1. 基本排序规则,左右元素进行比较,依次放入新数组中,一侧没有另一侧直接放入新数组;
static int[] Sort(int[] left, int[] right) 
{
    //准备一个新数组
    int[] arrayNew = new int[left.Length + right.Length];
    int leftIndex = 0;
    int rightIndex = 0; 

    //填满这个新数组
    for (int i = 0; i < arrayNew.Length; i++)
    {
        if (left[i] >= left.Length)
        {
            arrayNew[i] = right[rightIndex];
            rightIndex++;
        }
        else if(rightIndex >= right.Length)
        {
            arrayNew[i] = left[leftIndex];
            leftIndex++;
        }
        else if (left[leftIndex] < right[rightIndex])
        {
            arrayNew[i] = left[leftIndex];
            leftIndex++;
        }
        else 
        { 
            arrayNew[i] = right[rightIndex];
            rightIndex++;
        }
    }
    return arrayNew;
}

//2. 递归平分数组,不停分割数组,长度小于2时停止平分,从最小长度的数组开始比较,一层一层向上比较。
static int[] Merge(int[] array)
{
    //递归结束条件
    if(array.Length < 2) {  return array; }
    //1. 数组分两段,得到中间索引
    int mid = array.Length / 2;
    //2. 初始化左右数组
    int[] left = new int[mid];
    int[] right = new int[array.Length - mid];
    //左右初始化左右数组内容
    for (int i = 0;i < array.Length;i++)
    {
        if(i < mid)
        {
            left[i] = array[i];
        }
        else
        {
            right[i - mid] = array[i];
        }
    }
    return Sort(Merge(left), Merge(right));
}

Merge(array);
for (int i = 0; i < array.Length; i++)
{
    Console.WriteLine(array[i]);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值