【Java】排序算法 之 【归并排序】 总结
目录
- 1.合并两个有序数组函数
- 2. 归并排序
- 3. 非递归实现归并排序
1.合并两个有序数组函数
在学习归并排序之前,我们需要掌握合并两个有序数组为一个有序数组的函数是如何实现的
/*** 合并两个有序的数组*/public static void int[] mergeArray(int[] array1,int[] array2){//注意判断参数int[] tmp=new int[array1.length+array2.length];int k=0;int s1=0;int e1=array1.length-1;int s2=0;int e2=array2.length-1;while (s1<=e1 && s2<=e2){if (array1[s1]<=array2[s2]){tmp[k++]=array1[s1++];}else {tmp[k++]=array2[s2++];}}while (s1<=e1){tmp[k++]=array1[s1++];}while (s2<=e2){tmp[k++]=array2[s2++];}return tmp;}
2. 归并排序
原理:
归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide andConquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并
分割-合并 思路:
具体过程可参考同站大佬关于归并排序的讲解:
归并排序过程讲解
代码实现:
/*** 归并排序* 时间复杂度:O(logN*N)* 空间复杂度:O(N)* 稳定性:稳定的排序* 如果 array[s1] <= array[s2] 不取等号 那么就是不稳定的排序* 学过的排序 只有3个是稳定的:* 冒泡 插入 归并* @param array*/public static void mergeSort(int[] array){mergeSortInternal(array,0,array.length-1);}private static void mergeSortInternal(int[] array,int low,int high){if (low>=high){return;}int mid=low+((high-low)>>>1);//左边mergeSortInternal(array,low,mid);//右边mergeSortInternal(array,mid+1,high);//合并merge(array,low,mid,high);}private static void merge(int[] array,int low,int mid,int high){int[] tmp=new int[high-low+1];int k=0;int s1=low;int e1=mid;int s2=mid+1;int e2=high;while (s1<=e1 && s2<=e2){if (array[s1]<=array[s2]){tmp[k++]=array[s1++];}else {tmp[k++]=array[s2++];}}while (s1<=e1){tmp[k++]=array[s1++];}while (s2<=e2){tmp[k++]=array[s2++];}//拷贝tmp数组的元素,放入原来的数组array当中for (int i = 0; i < k; i++) {array[i+low]=tmp[i];}}
3. 非递归实现归并排序
核心思想没变,依旧是拆分为小区间进行依次合并
/*** 非递归实现归并排序* @param array*/public static void mergeSortF(int[] array){int nums=1; //每组的数据个数while (nums<=array.length){//数组每次都要进行遍历,确定要归并的区间for (int i = 0; i < array.length; i += nums*2) {int left=i;int mid=left+nums-1;//防止越界if (mid>=array.length){mid=array.length-1;}int right=mid+nums;//防止越界if (right>=array.length){right=array.length-1;}//下标确定以后,进行归并merge(array,left,mid,right);}nums *= 2;}}
【Java】排序算法 之 【归并排序】 总结相关推荐
- Java排序算法之归并排序
基本思想: 归并排序利用分治法,先将一个序列分成一个个子序列,然后对子序列进行排序,再把有序子序列合并为整体有序序列. 图片来自于http://www.cnblogs.com/shudonghe/p/ ...
- java 排序算法总结,Java排序算法总结之归并排序
本文实例讲述了Java排序算法总结之归并排序.分享给大家供大家参考.具体分析如下: 归并操作(merge),也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作.和快速排序类似,让我们一起来看 ...
- 排序算法:归并排序、快速排序
相关博客: 排序算法:冒泡排序.插入排序.选择排序.希尔排序 排序算法:归并排序.快速排序 排序算法:桶排序.计数排序.基数排序 排序算法:堆排序 十大排序算法小结 一.归并排序: 1.工作原理: 归 ...
- Java十大排序算法总结,Java排序算法总结之冒泡排序
本文实例讲述了Java排序算法总结之冒泡排序.分享给大家供大家参考.具体分析如下: 前言:冒泡排序(BubbleSort)就是依次比较相邻的两个数,将小数放在前面,大数放在后面. 下面让我们一起 ...
- 数据结构与算法:十大排序算法之归并排序
数据结构与算法:十大排序算法之归并排序 package TopTenSortingAlgorithms;/*** 归并排序:Java** @author skywang* @date 2014/03/ ...
- Java排序算法:冒泡排序
Java排序算法:冒泡排序 //创建数组并赋值int[] data = new int[] {11,10,55,78,100,111,45,56,79,90,345,1000};for(int i=0 ...
- 排序算法之--归并排序(好玩的一个算法o。o)快速入门
排序算法之--归并排序(好玩的一个算法o.o) 下面是归并操作的基本思路(注意:是归并操作哦,不是归并排序哦) 归并操作的工作原理如下: 第一步:申请空间,使其大小为两个已经排序序列之和,该空间用来存 ...
- NOI提高级:排序算法之归并排序、快速排序
图解排序算法(四)之归并排序 图解排序算法(四)之归并排序 - dreamcatcher-cx - 博客园 小学生图解排序算法:⑥归并排序 小学生图解排序算法:⑥归并排序_纯文笔记-CSDN博客_图解 ...
- Java排序算法之直接选择排序
Java排序算法之直接选择排序 基本过程:假设一序列为R[0]~R[n-1],第一次用R[0]和R[1]~R[n-1]相比较,若小于R[0],则交换至R[0]位置上.第二次从R[1]~R[n-1]中选 ...
- java排序算法 sort_Java排序算法之SleepSort排序示例
本文实例讲述了Java排序算法之SleepSort排序.分享给大家供大家参考,具体如下: 分享一个很有创意的排序算法:sleepSort .巧妙利用了线程的sleep(),代码如下: public c ...
最新文章
- 二年级上册计算题_小学二年级数学上册应用题与思维训练集锦500题
- 添加Graphic Drivers PPA
- 【刷题记录】杂题记录
- css布局左右2边固定,中间自适应
- 一个web版的计算器
- 在谈数据治理和数字化的时候,别忘了数据标准
- python怎么显示提示_Python中如何显示程序进度
- Visual C++ 2008入门经典 第十章标准模板库(二)
- asp.net + jQuery + LINQ 简单登录
- Android四大组件之Activity组件
- js判断是否是正整数,js判断是否是数字
- http和https简介、区别以及客户端到服务器https通讯步骤
- 高通9008刷机,刷机参考
- 沟通:如何用沟通解决80%的工作问题?
- 我的日程安排系列问题(区间重叠问题)
- java freemarker转PDF和Word
- BZOJ 2565 最长双回文串
- Android集成百度语音识别
- 深度学习 lr_scheduler 简易的warmup装饰器
- Linux守护进程编写