zoukankan      html  css  js  c++  java
  • 归并排序

     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; } }
  • 相关阅读:
    eclipse如何把多个项目放在一个文件夹下【eclipse中对项目进行分类管理】-图示详解
    hibernate中cache二级缓存问题
    Java处理正则验证手机号-详解
    Java处理手机号中间4位替换成*
    WPF:依赖属性的应用
    WPF:自定义路由事件的实现
    WPF:类型转换器的实现
    MFC中CString转化为char*
    Android4.4 往短信收件箱中插入自定义短信(伪造短信)
    OpenCV imread读取图片,imshow展示图片,出现cv:Exception at memory location异常
  • 原文地址:https://www.cnblogs.com/ssskkk/p/12590163.html
Copyright © 2011-2022 走看看