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; } }
  • 相关阅读:
    [转载]Oracle中TO_DATE()函数用法
    validationEngine
    批处理执行sql语句 osql
    asp.net导出excel
    Oracle nls_sort和nlssort 排序功能介绍
    js中2个等号与3个等号的区别
    【36】第零章 起航
    那些年,我还在学习Ajax
    那些年,我还在学习java
    那些年,我还在学习jquery
  • 原文地址:https://www.cnblogs.com/ssskkk/p/12590163.html
Copyright © 2011-2022 走看看