归并排序原理、演示及代码
归并排序
1.原理
归并排序是一种排序算法,它通过将待排序的数组或列表递归分割成较小的子数组,然后将这些子数组合并以生成一个有序的数组。
2.操作
- 分割(Divide):将待排序的数组分成两个大致相等的子数组,或者将列表分成两部分。这个过程是递归的,直到每个子数组或子列表都只包含一个元素为止。
- 合并(Merge):逐个合并两个有序的子数组(或子列表),以生成一个新的有序数组(或列表)。在合并过程中,通过比较两个子数组(或子列表)中的元素,将较小的元素放入新的有序数组(或列表),并继续这个过程,直到所有元素都合并为止。
- 递归:重复上述分割和合并过程,直到整个数组(或列表)都被排序为止。
3.演示

先递归分割,再逐步合并
4.代码
 		/**
         * @param nums 待排序数组
         * @param low  数组的开始元素索引
         * @param high 数组的结束元素索引
         * @return 升序排列的数组
         */
        public int[] mergeSort(int[] nums, int low, int high) {
            if (high - low <= 0) {
                int[] ints = new int[1];
                ints[0]=nums[low];
                return ints;
            }
            int mid = (low + high) / 2;
            int[] leftNums = mergeSort(nums, low, mid);
            int[] rightNums = mergeSort(nums, mid+1, high);
            int[] res = new int[leftNums.length+rightNums.length];
            int li = 0, ri = 0, i = 0;
            while (ri < rightNums.length && li < leftNums.length) {
                if (leftNums[li] < rightNums[ri]) {
                    res[i] = leftNums[li];
                    li++;
                    i++;
                } else {
                    res[i] = rightNums[ri];
                    ri++;
                    i++;
                }
            }
            if (li == leftNums.length) {
                while(ri<rightNums.length){
                    res[i] = rightNums[ri];
                    ri++;
                    i++;
                }
            }else{
                while(li<leftNums.length){
                    res[i] = leftNums[li];
                    li++;
                    i++;
                }
            }
            return res;
        }
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号