算法面经--归并排序

作者: 永不熄灭的火焰_e306 | 来源:发表于2020-06-12 21:30 被阅读0次

归并排序(递归合并)

一、算法思路

该算法采用经典的分治(****divide-and-conquer) 策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修 补"在一起,即分而治之)。

归并排序的实现:这个其实就是层次的问题,把一个很长的数组分段排好序,然后用比较插入的方式一次遍历把两个排好序的数组合并成一个。就这样递归最后整个数组排好序了。

示意图:

归并排序1.png 归并排序2.png

[图片上传失败...(image-aabb53-1591968533004)]

二、代码实现

 public class MergetSort {
  public static void main(String[] args) {
  int arr[]={8,4,5,7,1,3,6,2};

  int temp[] = new int[arr.length];   //归并排序需要一个额外的空间
  mergeSort(arr,0,arr.length-1,temp);
  System.out.println("归并排序后=" + Arrays.toString(arr));
  }

  //分解方法
  public static void mergeSort(int[] arr,int left,int right,int[] temp ){

  if(left >= right) return ;  //递归退出条件
  //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);

  //}
  }

  //合并算法
  public static void merge(int[] arr, int left, int mid, int right, int[] temp){
  int i = left;  //初始化i,左边有序序列的初始索引
  int j = mid+1;  //初始化j,右边有序序列的初始索引
  int t = 0; //指向temp数组的当前索引

  //(一)
  //先把左右两边(有序)的数据按照规则填充到temp数组中
  //直到左右两边的有序序列,又一遍处理完毕为止
  while(i<=mid && j<=right){  //继续
  //如果左边的有序序列的当前元素,小于等于右边有序序列的当前元素
  //即将左边的当前元素,填充到 temp数组 
  //然后 t++, i++
  if(arr[i]<=arr[j]){
  temp[t] = arr[i];
  i+=1;
  }else{  //反之,将右边有序序列的当前元素,填充到temp数组中
  temp[t] = arr[j];
  j+=1;
  }
  t+=1;
  }
  //(二)
  //把有剩余数据的一边的数据依次全部填充到temp
  while( i <= mid) { //左边的有序序列还有剩余的元素,就全部填充到temp
  temp[t++] = arr[i++];
  } 

  while( j <= right) { //左边的有序序列还有剩余的元素,就全部填充到temp
  temp[t++] = arr[j++];
  }
  //(三)
  //将temp数组的元素拷贝到arr
  //注意,并不是每次到拷贝所有
 //  t = 0;
 //  int tempLeft = left;
 //  //第一次合并 tempLeft = 0,right = 1 //tempLeft = 2,right = 3//tL=0 ri=3
 //  //最后一次 tempLeft = 0,right =7
 //  while(tempLeft <= right){
 //  arr[tempLeft] = temp[t];
 //  t+=1;
 //  tempLeft +=1;
 //  }
  //for循环实现将temp元素(left~right)拷贝到arr
  for(int tempLeft = left;tempLeft <= right;tempLeft++){
  arr[tempLeft] = temp[tempLeft -left];
  }
  }
 ​
 }

相关文章

  • 2018-06-30

    排序算法之归并排序 归并排序算法是排序算法中的经典算法之一,其核心思想是利用归并的思想实现的排序方法,该算法采用经...

  • 算法面经--归并排序

    归并排序(递归合并) 一、算法思路 该算法采用经典的分治(****divide-and-conquer) 策略(分...

  • java实现快速排序、归并排序、希尔排序、基数排序算法...

    快速排序算法 归并排序算法 希尔排序算法 基数排序算法

  • 排序算法之归并排序

    归并排序(Merge Sort) 归并排序是利用归并的思想实现排序的方式,该算法采用的是经典的分治算法 归并排序过...

  • 归并排序

    图解排序算法(四)之归并排序 基本思想 归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用...

  • 归并排序

    归并排序 这个排序算法是建立在归并操作上的一种有效的排序算法,算法主要采用分治法,归并排序的算法复杂度为O(n*l...

  • 第三章:高级排序算法

    归并排序算法(mergeSort) 算法思想:Python使用函数实现: 自底向上的归并排序算法 算法思想:Pyt...

  • 算法入门——归并排序、希尔排序

    上篇文章我们学习了算法入门——堆排序,这篇文章我们学习算法入门——归并排序、希尔排序。 归并排序 归并排序是将一个...

  • 归并算法

    归并排序(Merge sort,台湾译作:合并排序)是建立在归并操作上的一种有效的排序算法。归并算法的中心是归并两...

  • web开发需要知道的几个算法

    算法分类 快速排序算法 深度优先算法 广度优先算法 堆排序算法 归并排序算法

网友评论

    本文标题:算法面经--归并排序

    本文链接:https://www.haomeiwen.com/subject/ruzntktx.html