码迷,mamicode.com
首页 > 编程语言 > 详细

归并排序

时间:2020-07-30 14:36:43      阅读:67      评论:0      收藏:0      [点我收藏+]

标签:越界   有序   nbsp   bsp   中间   调用   key   plain   fence   

归并排序

归并排序是将原始数组拆分成若干个子序列,将子序列排序完以后再合并起来。

 public static int [] mergrSort(int[] arr){
       Sort(arr,0,arr.length-1);
       return arr;
  }
?
   public static void Sort(int[] arr,int left,int right){
       //判断数组中有几个元素,如果只有一个元素,那是有序的,下标不合理会出现数组下标越界
       if(left >= right){
           return;
      }
       //取出数组的中间元素,并保存
       int mid = (left + right)/2;
       //递归循环中间元素的左边
       Sort(arr,left,mid);
       //递归循环中间元素的右边
       Sort(arr,mid+1,right);
       //将分开的数组有序的合并起来
       //调用合并方法
       merge(arr,left,mid,right);
?
  }
?
?
   public static void merge(int [] arr,int left,int center,int right){
   //建立一个空数组,来临时存储排序的数组
   int [] tempArr = new int[arr.length];
   //临时数组的索引,并赋值,用于随时增加
       int t = left;
       //临时数组的索引,用于最后临时数组向arr数组中移动元素中
       int tmp = left;
       //右边数组的第一个下标
       int mid  =center +1;
?
       while (left <= center && mid <= right){
           if(arr[left]<= arr[mid]){//左边数组元素小于右边
               tempArr[t++] = arr[left++];//将左边小的数组放进临时数组中,并向后移动索引
          }
           else{
               tempArr[t++] = arr[mid++];//将右边较小的元素放进临时数组中,并向后移动索引
          }
?
      }
       //将左边数组剩下的元素放进临时数组中
       while(left <= center){//等号不能忘记
           tempArr[t++] =arr[left++];
      }
       //将右边数组中剩余的元素放进临时数组中
       while (mid <=right){
           tempArr[t++] = arr[mid++];
      }
       //将临时数组中元素放进原数组arr里
       while(tmp<=right){
           arr[tmp] = tempArr[tmp++];
      }
  }

 

归并排序

标签:越界   有序   nbsp   bsp   中间   调用   key   plain   fence   

原文地址:https://www.cnblogs.com/stydejava/p/13403110.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!