排序算法-归并排序

归并排序

归并排序(Merge Sort)是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。

思路

  • 拆分
    1.利用递归,将大的数据集拆分成小的的数据集。
    图片只作为宏观思路
  • 合并
    1.申请额外的空间辅助排序
    2.创建两个指针,zhi分别指向两个数组的起始位置
    3.比较两个指针位置的元素并放入辅助数组中,控制指针后移,比较后若某个数组中还有元素则直接追加拷贝到数组数组中
    4.将辅助空间中排好序的元素拷贝回原数组
    图片说明

    代码实现

    public class Merge{
      public static void mergeSort(int[] arr){
          if(arr == null || arr.length < 2){
              return;
          }
          mergeSort(arr,0,arr.length - 1);
      }
      //递归拆分
      public static void mergeSort(int[] arr,int left,int right){
          if(left == right){
              return;
          }
          int mid = mid=(left+right)/2;
          mergeSort(arr,left,mid);
          mergeSort(arr,mid + 1,right);
          merge(arr,left,mid,right);
      }
      //合并
      public static void merge(int[] arr,int left,int mid, int right){
          int[] help = new int[right - left + 1];//申请额外的空间辅助排序
          int i = 0;
          int p1 = left; //两个指针,指向两个待合并数据的其实位置
          int p2 = mid + 1;
          //比较并放入辅助数组
          while(p1 <= mid && p2 <= right){
              help[i++] = arr[p1] < arr[p2] ? arr[p1++] : arr[p2++];
          }
          //剩余元素追加进辅助数组
          while(p1 <= mid){
              help[i++] = arr[p1++];
          }
          while(p2 <= right){
              help[i++] = arr[p2++];
          }
          //将辅助数组中排好序的元素拷贝回去
          for(int k = 0; k < help.length; k++){
              arr[left + k] = help[k];
          }
      }
      public static void main(String[] args) {
          int[] arr = new int[]{2,3,6,0,8,7,4,1};
          mergeSort(arr);
          for (int i = 0; i < arr.length ; i++) {
              System.out.println(arr[i]);
          }
      }
    }
全部评论

相关推荐

暮雨轻歌:看起来hr不能接受我菜查看图片
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务