zoukankan      html  css  js  c++  java
  • 归并排序的实现,递归与非递归

    都在注释里了:

    import java.util.Arrays;
    
    public class MergeSort {
        public static void main(String[] args) {
            int[] a = {2,1,13,10,5,3,8,8,4,9,4};
            mergeSort(a);                //非递归就用这句
            //recuSort(a,0,a.length-1);   //递归就用这句
            System.out.println(Arrays.toString(a));
        }
    
        public static void mergeSort(int []a) {  //非递归,复杂些
            int length = a.length;
            int len = 1;           //len 表示左边len个,右边len个做归并。起始为1,即两两归并
            while(len < length) {
                for(int i = 0;i + len < length;i = i + (len << 1)) {   //对于每个归并单位,从0开始,直到开始归并的下标+归并单位的值超过最大下标
                    int low = i;              //每次归并的开始总是i
                    int mid = i + len - 1;     //一定要在这里用起始下标+归并单位计算mid,不能用high和low算,因为个数为奇数时high是截取的
                    int high = low + (len << 1) - 1;   //计算high
                    if(high > length-1)               //如果数组元素个数是奇数,那high最后一次就会超出下标,这时置为最大下标
                        high = length-1;
                    merge(a,low,high,mid);         //开始归并,以mid为界,将low--high的元素归并为有序
                }
                len = len << 1;      //第一次两两归并,第二次就四四归并,第三次就八八归并,以此类推
            }
        }
    =================================================================================================================================
        public static void recuSort(int[] a,int low,int high) {  //递归的方法,比较简单
            if(low >= high)
                return;
            int mid = low + (high-low)/2;
            recuSort(a,low,mid);
            recuSort(a,mid + 1,high);
            merge(a,low,high,mid);
        }
    
        public static void merge(int[] a,int low,int high,int mid) {      //low---mid是左边,mid+1---high是右边
            int[] temp = new int[a.length];
            int index = low;
            int left = low;
            int right = mid+1;
            while(left <= mid && right <=high) {    //将两边的元素比较,从而有序的逐个加入一个临时数组
                if(a[left] < a[right])
                    temp[index++] = a[left++];
                else
                    temp[index++] = a[right++];
            }
            while(left <= mid)         //上一步是逐个加入,左右两边肯定有一边先到终点,需要将另一边的元素全部加入临时数组
                temp[index++] = a[left++];
            while(right <= high)
                temp[index++] = a[right++];
    
            while(low <= high)     //将临时数组的有序元素复制到源数组
                a[low] = temp[low++];
        }
    }
  • 相关阅读:
    Windows 驱动加载程序代码
    coding push 上传文件
    MinGW 可以编译驱动的
    通过使用 NTLite 工具实现精简Windows系统
    一些常用的注入技巧
    Python 图片转字符图
    MySQL数据库及注入方法
    路由器被蹭网后,我有被黑的风险吗?
    markdown 实现代码折叠效果
    Windows 签名伪造工具的使用,Python,签名
  • 原文地址:https://www.cnblogs.com/shen-qian/p/11912769.html
Copyright © 2011-2022 走看看