• 算法笔记


    排序算法2

    2、归并排序

    归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。

    原理:通过对若干个有序节点的归并实现排序。

    方法:1、先将原序列拆分成若干子序列 2、将子序列重组成两个有序列 3、合并两个有序列

    例 待排序序列为{ 28, 7, 27, 3, 1, 6, 9, 0, 5, 4 }

    (1)拆分序列后{28,7,27,3,1}{6,9,0,5,4}——>{28,7,27}{3,1}/{6,9,0}{5,4}——>{28,7}{27}/{3,1}/{6,9}{0}/{5,4}——>{28}{7}{27}{3}{1}/{6}{9}{0}{5}{4}

    (2)合并序列为有序列{7,28}{3,27}{1}/{6,9}{0,5}{4}——>{3,7,27,28}{1}/{0,5,6,9}{4}——>{1,3,7,27,28}/{0,4,5,6,9}

    (3)合并有序列{0, 1, 3, 4, 5, 6, 7, 9, 27, 28}

    代码实现(JAVA)

    import java.util.Arrays;
    
    public class mergesort {
    	    /** 
    	     * 归并排序 
    	     * 简介:将两个(或两个以上)有序表合并成一个新的有序表 即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列 
    	     * 时间复杂度为O(nlogn) 
    	     * 稳定排序方式 
    	     */  
    	//start起始下标  end最后一位下标
    	    public static int[] sort(int[] nums, int start, int end) {  
    	        int mid = (start + end) / 2;  
    	        if (start < end) {  
    	            // 左边  
    	            sort(nums, start, mid);  
    	            // 右边  
    	            sort(nums, mid + 1, end); 
    	            // 左右归并  
    	            merge(nums, start, mid, end);  
    	        }  
    	        return nums;  
    	    }  
    	  
    	    public static void merge(int[] nums, int start, int mid, int end) {  
    	        int[] temp = new int[end - start + 1];  
    	        int i = start;//左序列起始  
    	        int j = mid + 1;//右序列起始
    	        int k = 0;  
    	  
    	        // 比较两个有序列,将最小的放入临时序列中  
    	        while (i <= mid && j <= end) {  
    	            if (nums[i] <= nums[j]) {  
    	                temp[k++] = nums[i++];  
    	            } else {  
    	                temp[k++] = nums[j++];  
    	            }  
    	        }  
    	  
    	        // 把左边剩余的数移入临时序列 
    	        while (i <= mid) {  
    	            temp[k++] = nums[i++];  
    	        }  
    	  
    	        // 把右边边剩余的数移入临时序列  
    	        while (j <= end) {  
    	            temp[k++] = nums[j++];  
    	        }  
    	  
    	        // 把临时序列中的数覆盖nums数组  
    	        for (int k2 = 0; k2 < temp.length; k2++) {  
    	            nums[k2 + start] = temp[k2];  
    	        }  
    	    }  
    	  
    	      
    	    // 归并排序的实现  
    	    public static void main(String[] args) {  
    	  
    	        int[] nums = { 28, 7, 27, 3, 1, 6, 9, 0, 5, 4 };  
    	        mergesort.sort(nums, 0, nums.length-1);  
    	        System.out.println("sort:"+Arrays.toString(nums));  
    	    }  
    	
    
    }
    

      

    作者:(奎恩)quinns
    出处:https://www.cnblogs.com/quinnsun/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
    如果文中有什么错误,欢迎指出。以免更多的人被误导。
  • 相关阅读:
    大型网站优化-memcache技术
    MySQL常见注意事项及优化
    网站优化—mysql explain执行计划
    网站优化—MySQL优化
    网站优化—页面静态化技术
    防盗链案例
    伪静态的实现
    (19) PHP 随笔---LAMP 系统常用命令
    (17) PHP 随笔---LAMP vi编辑器
    (18) PHP 随笔---LAMP 权限操作
  • 原文地址:https://www.cnblogs.com/quinnsun/p/code_mergesort.html
Copyright © 2020-2023  润新知