博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
算法笔记
阅读量:6969 次
发布时间:2019-06-27

本文共 2196 字,大约阅读时间需要 7 分钟。

排序算法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));  	    }  	}

  

转载于:https://www.cnblogs.com/quinnsun/p/code_mergesort.html

你可能感兴趣的文章
统计学中RR OR AR HR的区别
查看>>
vue加百度统计代码(亲测有效)
查看>>
判断Json字符串返回类型 对象 或者 数组
查看>>
SpringCloud2.0入门3-新的eureka依赖
查看>>
Java基础-SSM之mybatis多对多关联
查看>>
Google展示“配方搜索”概念 利用语义搜索学做菜
查看>>
窗体界面设计01
查看>>
IOS开发技巧之──字数统计函数
查看>>
Cocos2d API 解析之Texture2d
查看>>
Java编程中“为了性能”尽量要做到的一些地方
查看>>
C# 使用OLEDB读取不同版本Excel数据的连接字符串
查看>>
设置tomcat启动超时,不会自动停止
查看>>
005商城项目:ssm框架的整合成功之后的问题:使用maven的tomcat插件时的debug
查看>>
poj2126
查看>>
内表查询用到外表
查看>>
Silverlight多文件(大文件)上传的开源项目
查看>>
HTML5网站大观:分享8个精美的 HTML5 网站案例
查看>>
php rewrite
查看>>
【转】从bundle中复制文件到Documents目录中的代码
查看>>
【转】UIWebView获取当前页面url的两种方法
查看>>