• 归并排序


     1)归并排序思想

      1)将数组分成两半

      2)对左边排序

      3)对右边排序

      4)两边都排好顺了 对左右两边进行merge

    代码步骤1)两个半截数组已经排好序的情况下,把他们合并到一起

    第一次比较 1比3小 把1放到下面,i++

    第二次比较 4比3大 把3放到下面,j++

            int mid=arr.length/2;
            int temp[] = new int[arr.length];
            int i=0;
            int j=mid+1;
            int k=0;
            while (i<=mid&&j<arr.length){
                if (arr[i]<arr[j]){
                    temp[k++]=arr[i++];
                }else{
                    temp[k++]=arr[j++];
                }
            }

    最后两个半截数组如果有剩下的,直接copy到下面

            while (i<=mid){
                temp[k++]=arr[i++];
            }
            while (j<arr.length){
                temp[k++] =arr[j++];
            }

    代码步骤2)因为我们merge的时候 可能merge的是数组的一部分,下面把上面的方法改进

    leftPtr左指针指的位置

    rightPtr右指针指的位置

    leftPtr右边界

        static void merge(int[] arr,int leftPtr,int rightPtr,int rightBound){
            int mid=rightPtr-1;
            int temp[] = new int[rightBound-leftPtr+1];
            int i=leftPtr;
            int j=rightPtr;
            int k=0;
            while (i<=mid&&j<=rightBound){
                if (arr[i]<arr[j]){
                    temp[k++]=arr[i++];
                }else{
                    temp[k++]=arr[j++];
                }
            }
            while (i<=mid){
                temp[k++]=arr[i++];
            }
            while (j<=rightBound){
                temp[k++] =arr[j++];
            }
            print(temp);
        }

     代码步骤3)使用递归完成归并排序

    package com.example.sort;
    
    public class MergeSort {
    
        public static void main(String[] args) {
            int[] arr={1,4,100,7,10,2,3,5,8,9};
            sort(arr,0,arr.length-1);
            print(arr);
        }
    
        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 merge(arr,left,mid
    +1,right); } /*** * 两个半截数组已经排好序的情况下 * 把他们合并到一起 * 指定整个数组不够灵活,增加参数 * @param arr */ static void merge(int[] arr,int leftPtr,int rightPtr,int rightBound){ int mid=rightPtr-1; int temp[] = new int[rightBound-leftPtr+1]; int i=leftPtr; int j=rightPtr; int k=0; while (i<=mid&&j<=rightBound){ if (arr[i]<arr[j]){ temp[k++]=arr[i++]; }else{ temp[k++]=arr[j++]; } } while (i<=mid){ temp[k++]=arr[i++]; } while (j<=rightBound){ temp[k++] =arr[j++]; }   //把temp数组复制到arr数组中; for (int m=0;m<temp.length;m++){ arr[leftPtr+m]=temp[m]; } } private static void swap(int[] arr, int i, int j) { int t = arr[i]; arr[i] = arr[j]; arr[j] = t; } }
  • 相关阅读:
    Centos7安装Python3的方法
    接口测试用例和报告模板
    【其他】【Redis】Redis 16 个常见使用场景
    【其他】【RPC】RPC 框架的结构和设计
    【Java】【集合类】Java Map集合 遍历 五种方式(包含 Lambda 表达式遍历)
    【JAVA】【集合类】 ArrayList循环删除陷阱及迭代器介绍
    【Java】【集合类】JAVA构造MAP并初始化MAP
    【Java】【集合类】Java 中初始化 List 集合的方式
    【java】【日期和时间】总结
    VUE图片下载 针对png格式的 单个下载图片 多个图片下载压缩包
  • 原文地址:https://www.cnblogs.com/ssskkk/p/12590163.html
Copyright © 2020-2023  润新知