归并排序 实现 要点 代码 注释 内存优化

要点

  • 分治,把数组二分成2部分,分别对这两部分排序,合并这两部分
  • 合并函数借助新的内存空间

内存优化

  • 合并函数不借助新的内存,使用插入排序完成合并
    /*
    使用插入排序优化合并方法
    不用创建新的数组,减少内存使用
     */
    public void Merge2(int[] array, int from, int mid, int to)
    {
      for (var i = mid + 1; i <= to; i++)
      {
        var temp = array[i];
        for (var j = i - 1; j >= from; j--)
        {
          if (temp < array[j])
          {
            array[j + 1] = array[j];
            array[j] = temp;
          }
          else
          {
            break;
          }
        }
      }
    }

实现

namespace DataStructure
{

/*
归并排序,分治、排序、合并
 */
  public class MergeSort
  {

    public int[] Sort(int[] array)
    {
      return Sort(array, 0, array.Length - 1);
    }

    //include from and to
    public int[] Sort(int[] array, int from, int to)
    {
      if (from < to)
      {
        var mid = (from + to) / 2;
        Sort(array, from, mid);
        Sort(array, mid + 1, to);
        Merge2(array, from, mid, to);
      }
      return array;
    }

    public void Merge(int[] array, int from, int mid, int to)
    {
      var tempArray = new int[to - from + 1];
      var indexA = from;
      var indexB = mid + 1;
      var indexTemp = 0;

      while (indexA <= mid && indexB <= to)
      {
        if (array[indexA] < array[indexB])
        {
          tempArray[indexTemp] = array[indexA];
          indexA++;
        }
        else
        {
          tempArray[indexTemp] = array[indexB];
          indexB++;
        }
        indexTemp++;
      }

      while (indexA <= mid)
      {
        tempArray[indexTemp] = array[indexA];
        indexTemp++;
        indexA++;
      }

      while (indexB <= to)
      {
        tempArray[indexTemp] = array[indexB];
        indexTemp++;
        indexB++;
      }

      for (var i = from; i <= to; i++)
      {
        array[i] = tempArray[i - from];
      }
    }

    /*
    使用插入排序优化合并方法
    不用创建新的数组,减少内存使用
     */
    public void Merge2(int[] array, int from, int mid, int to)
    {
      for (var i = mid + 1; i <= to; i++)
      {
        var temp = array[i];
        for (var j = i - 1; j >= from; j--)
        {
          if (temp < array[j])
          {
            array[j + 1] = array[j];
            array[j] = temp;
          }
          else
          {
            break;
          }
        }
      }
    }

    public void TestMerge()
    {
      var array = new int[] { 3, 4, 9, 1, 2, 7 };
      Merge(array, 0, 2, array.Length - 1);
      BaseSolution.printArray(array);
    }

    public void TestMerge2()
    {
      var array = new int[] { 3, 4, 9, 1, 2, 7 };
      Merge2(array, 0, 2, array.Length - 1);
      BaseSolution.printArray(array);
    }

  }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
归并排序是一种经典的排序算法,它采用分治的思想,将待排序的数组不断地分割成小的子数组,然后再将这些子数组合并成一个有序的数组。下面是归并排序的Java代码注释: ```java public class MergeSort { // 归并排序入口函数 public static void mergeSort(int[] arr) { int[] temp = new int[arr.length]; // 创建一个临时数组用于存储排序结果 mergeSort(arr, 0, arr.length - 1, temp); // 调用递归函数进行归并排序 } // 递归函数,实现归并排序 private static void mergeSort(int[] arr, int left, int right, int[] temp) { if (left < right) { int mid = (left + right) / 2; // 计算中间位置 mergeSort(arr, left, mid, temp); // 对左半部分进行归并排序 mergeSort(arr, mid + 1, right, temp); // 对右半部分进行归并排序 merge(arr, left, mid, right, temp); // 合并左右两部分 } } // 合并函数,将两个有序的子数组合并成一个有序的数组 private static void merge(int[] arr, int left, int mid, int right, int[] temp) { int i = left; // 左子数组的起始位置 int j = mid + 1; // 右子数组的起始位置 int k = 0; // 临时数组的起始位置 // 将左右两个子数组中较小的元素依次放入临时数组中 while (i <= mid && j <= right) { if (arr[i] <= arr[j]) { temp[k++] = arr[i++]; } else { temp[k++] = arr[j++]; } } // 将剩余的元素依次放入临时数组中 while (i <= mid) { temp[k++] = arr[i++]; } while (j <= right) { temp[k++] = arr[j++]; } // 将临时数组中的元素复制回原数组 for (int m = 0; m < k; m++) { arr[left + m] = temp[m]; } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值