归并排序(详细注释)

归并排序

归并采用了分而治之的思想,也就是分治法。

例如数据9,8,7,6,5,4,3,2,1

一串数字,以二分法的方式将数据不断的递归截取成两部分,直到数据只有2位

从此开始,将每次递归返回后的左递归数据段和右递归的数据段想比较排序,得出从小到大的顺序

public static void main(String[] args) {
        System.out.println("归并排序--");
        
    //待排序的数组数据
    	int[] arr = new int[80000000];
        for(int i=0;i<arr.length;i++){
            arr[arr.length-i-1] = i;
        }

        Date date =new Date();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh-mm-ss SSS");
        System.out.println(simpleDateFormat.format(date.getTime()));

		//中转数组,用于暂时存放数据
        int[] temp = new int[arr.length];
        mergeSort(arr,0,arr.length-1,temp);


        Date date1 =new Date();
        System.out.println(simpleDateFormat.format(date1.getTime()));
    	//以上代码均是为了观测算法运行效率
    
    }

    public static void mergeSort(int[] arr,int left,int right,int[] temp){
        if(left<right){
            int mid = (right+left)/2;
            //左递归
            mergeSort(arr,left,mid,temp);
            //右递归
            mergeSort(arr,mid+1,right,temp);
            //对左递归的数据和有递归的数据进行一次排序,每次比较的是从左到右的数据小的先放入中转数组
            merge(arr,left,mid,right,temp);
        }
    }

    public static void merge(int[] arr,int left,int mid,int right,int[] temp){
        int i = left;
        int j = mid+1;
        int t=0;
		//左递归数据的最左开始(left)与右递归的最左开始(mid+1),相比较,发现较小的数就优先将较小的数据放入temp中,将放入的数据的下标+1,找到后面一个数,再次比较,直到其中一个递归的数据全部存入temp中,另一个递归的数据,接下来处理
        while (i<=mid && j<=right){
            if(arr[i]<=arr[j]){
                temp[t] = arr[i];
                i++;
                t++;
            }else{
                temp[t] = arr[j];
                j++;
                t++;
            }
        }
        
        //i<=mid判断左递归的数据是否还有剩余,右则全部依次存入temp中,这些数据就是之前遗留数据
        while (i<=mid){
            temp[t] = arr[i];
            i++;
            t++;
        }
        
        //j<=right判断右递归的数据是否还有剩余,右则全部依次存入temp中,这些数据就是之前遗留数据
        while (j<=right){
            temp[t] = arr[j];
            j++;
            t++;
        }
        //t是temp的下标,先清零,找到开头
        t=0;
        //
        int templeft = left;
        //表示将temp中的数据放入arr总是从left的下标开始,因为各个递归中left总是链接者靠左递归的right+1,得以数据存储连续
        while (templeft<=right){
            arr[templeft] = temp[t];
            t++;
            templeft++;
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
归并排序是一种经典的排序算法,它采用分治的思想,将待排序的数组不断地分割成小的子数组,然后再将这些子数组合并成一个有序的数组。下面是归并排序Java代码注释: ```java public class MergeSort { // 归并排序入口函数 public static void mergeSort(int[] arr) { int[] temp = new int[arr.length]; // 创建一个临时数组用于存储排序结果 mergeSort(arr, 0, arr.length - 1, temp); // 调用递归函数进行归并排序 } // 递归函数,实现归并排序 private static void mergeSort(int[] arr, int left, int right, int[] temp) { if (left < right) { int mid = (left + right) / 2; // 计算中间位置 mergeSort(arr, left, mid, temp); // 对左半部分进行归并排序 mergeSort(arr, mid + 1, right, temp); // 对右半部分进行归并排序 merge(arr, left, mid, right, temp); // 合并左右两部分 } } // 合并函数,将两个有序的子数组合并成一个有序的数组 private static void merge(int[] arr, int left, int mid, int right, int[] temp) { int i = left; // 左子数组的起始位置 int j = mid + 1; // 右子数组的起始位置 int k = 0; // 临时数组的起始位置 // 将左右两个子数组中较小的元素依次放入临时数组中 while (i <= mid && j <= right) { if (arr[i] <= arr[j]) { temp[k++] = arr[i++]; } else { temp[k++] = arr[j++]; } } // 将剩余的元素依次放入临时数组中 while (i <= mid) { temp[k++] = arr[i++]; } while (j <= right) { temp[k++] = arr[j++]; } // 将临时数组中的元素复制回原数组 for (int m = 0; m < k; m++) { arr[left + m] = temp[m]; } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值