本文带来八大排序算法之归并排序算法。

归并排序是利用归并思想实现的排序算法,该算法采用经典的分治DAC(divide - and - conquer)策略。分治法将问题分(divide)成一些小的问题,然后递归求解,而治(conquer)的阶段将分的阶段得到的各答案“修补”在一起,即分而治之。

归并排序思想图解:

分的过程:只是将8个数据分成八组(直到不可再分为止),分是为后面的治提供递归条件。

治的阶段:将两个有序的子序列合并成一个有序序列,以上图最后一次合并为例,将[4, 5, 7, 8]  和 [1, 2, 3, 6]这两个已经有序的子序列合并为最终序列[1,2,3,4,5,6,7,8]

上图总共合并4+2+1=7次。

temp是临时数组

代码实现及注释:

import java.util.Arrays;public class MergeSort {// Driver method public static void main(String args[]) {int arr[] = { 8, 4, 5, 7, 1, 3, 6, 2 }; int[] temp = new int[arr.length]; //归并排序需要额外空间mergeSort(arr, 0, arr.length-1, temp);System.out.println("归并合并后:" + Arrays.toString(arr));}//分 + 合的方法public static void mergeSort(int[] arr, int left, int right, int[] temp){if(left < right){ //只要left索引小于right 就一直往下分divideint mid = (left + right) / 2; //中间索引//向左递归进行分解mergeSort(arr, left, mid, temp);//向右递归进行分解mergeSort(arr, mid + 1, right, temp);//合并。有余是递归,根据栈的机制,从上往下开始合并(从分解后一个元素为一组合并,然后2个元素一组,然后4个元素一组....)merge(arr, left, mid, right, temp);}}/*** * @param arr 待排序的数组* @param left 左边有序序列的初始(注意是有序的,这时候已经divide完毕,每个组的数组已经是有序的了)索引 .参考示意图 不同颜色表示不同部分* @param mid 中间索引* @param right 最右索引* @param temp 中转数组*///合并的方法public static void merge(int[] arr, int left, int mid, int right, int[] temp){System.out.println("*******");int i = left; //初始化i 左边有序序列的初始索引(注意是有序的,这时候已经divide完毕,每个组的数组已经是有序的了)int j = mid + 1; //初始化j 右边有序序列的初始索引(注意是有序的,这时候已经divide完毕,每个组的数组已经是有序的了)int t = 0; //指向temp数组的当前索引//(一) 先把左右两边(已经是有序的,因为最小的时候只有 1个数)的数据按照规则填充到temp数组,直到左右两边的有序序列,有一边处理完毕为止while(i <= mid && j <= right){ //如果左边的有序序列的当前元素,小于等于右边有序序列的当前元素//即将左边有序序列的当前元素,拷贝到temp数组//然后 t++,i++if(arr[i] <= arr[j]){temp[t] = arr[i];t += 1;i += 1;}else{ //反之,将右边有序序列的当前元素,拷贝到temp数组temp[t] = arr[j];t += 1;j += 1;}}//(二)把剩余数据的一边的数据依次全部填充到tempwhile(i <= mid){ //左边的有序序列还有剩余的元素,就全部填充到temptemp[t] = arr[i];t += 1;i += 1;}while(j <= right){ //右边的有序序列还有剩余的元素,就全部填充到temptemp[t] = arr[j];t += 1;j += 1;}//(三)将temp数组的元素拷贝到arr//并不是每次 都拷贝所有元素(示例中为8个元素)t = 0;int tempLeft = left;System.out.println("tempLeft = " + tempLeft + " , right = " + right);while(tempLeft <= right){//第一次 tempLeft = 0, right = 1; //第二次 tempLeft = 2, right = 3;//第三次 tempLeft = 0, right = 3;//最后一次 tempLeft = 0, right = 7;arr[tempLeft] = temp[t];t += 1;tempLeft += 1;} }}

7次合并打印:

Java实现归并排序 Merge Sort相关推荐

  1. 排序算法二:归并排序(Merge sort)

    归并排序(Merge sort)用到了分治思想,即分-治-合三步,算法平均时间复杂度是O(nlgn). (一)算法实现 1 private void merge_sort(int[] array, i ...

  2. C语言以递归实现归并排序Merge Sort算法(附完整源码)

    以递归实现归并排序Merge Sort 以递归实现归并排序Merge Sort算法的完整源码(定义,实现,main函数测试) 以递归实现归并排序Merge Sort算法的完整源码(定义,实现,main ...

  3. C语言归并排序Merge Sort算法(附完整源码)

    归并排序Merge Sort 归并排序Merge Sort算法的完整源码(定义,实现,main函数测试) 归并排序Merge Sort算法的完整源码(定义,实现,main函数测试) #include ...

  4. python选择排序算法图解_python基本算法之实现归并排序(Merge sort)

    0.前言 评判一个算法的好坏的标准: 时间复杂度 空间复杂度 1.归并排序算法是什么? 冒泡排序(Bubble Sort)是一种建立在归并操作上面的一种有效的排序算法,由John von neuman ...

  5. python 归并排序算法_python基本算法之实现归并排序(Merge sort)

    0.前言 评判一个算法的好坏的标准: 时间复杂度 空间复杂度 1.归并排序算法是什么? 冒泡排序(Bubble Sort)是一种建立在归并操作上面的一种有效的排序算法,由John von neuman ...

  6. 归并排序(merge sort)算法实现

    归并排序(merge sort)体现了分治的思想,即将一个待排序数组分为两部分,对这两个部分进行归并排序,排序后,再对两个已经排序好的数组进行合并.这种思想可以用递归方式很容易实现.归并排序的时间复杂 ...

  7. 归并python_python基本算法之实现归并排序(Merge sort)

    0.前言 评判一个算法的好坏的标准: 时间复杂度 空间复杂度 1.归并排序算法是什么? 冒泡排序(Bubble Sort)是一种建立在归并操作上面的一种有效的排序算法,由John von neuman ...

  8. 经典排序算法 - 归并排序Merge sort

    经典排序算法 - 归并排序Merge sort 原理,把原始数组分成若干子数组,对每一个子数组进行排序, 继续把子数组与子数组合并,合并后仍然有序,直到全部合并完,形成有序的数组 举例 无序数组[6 ...

  9. 归并有效排序算法matlab,科学网—[用MATLAB写算法]之排序算法2)归并排序merge sort - 徐勇刚的博文...

    归并排序(merge sort)是一种利用分治策略(divide and conquer)进行排序的算法,算法复杂度为 $\Theta (nlog_{2}n)$ . filename: merge_s ...

最新文章

  1. 一、如何实现python导入另一个文件中的模块(方法)?
  2. leetcode位运算的题
  3. 神经网络预测模型算法_MATLAB Elman神经网络的数据预测—电力负荷预测模型研究...
  4. 使用Nginx搭建简单的音视频直播平台RTMP协议
  5. 特权同学笔记-榨干FPGA片上存储资源
  6. python中for循环和while循环的区别_python中while循环和for循环的定义和详细的使用方法...
  7. [转]python 中的字符串连接
  8. 存在弱口令漏洞_【安全漏洞通告】secnet安网的AC集中管理平台存在弱口令漏洞...
  9. 北京时间的拼音及解释
  10. 机器学习——One-Hot编码
  11. 中国塑料加工机械市场趋势报告、技术动态创新及市场预测
  12. oracle exp(dmp)命令带过滤条件?
  13. Python图像的手绘效果
  14. ALFA机器视觉深度学习外观检测自学习人工智能软件——红色工具
  15. [BZOJ4246]两个人的星座(计算几何)
  16. linux服务器在没有网的条件下,怎么安装使用numpy呢
  17. AppleStore下载量查看
  18. 假期再次延长,我们可以做什么?
  19. HDU 4937Lucky Number
  20. 【区间dp】关路灯 牛客网题解

热门文章

  1. html改变下拉框的大小,调整屏幕大小时,HTML导航栏下拉框内容无法正确调整大小...
  2. 软件开发规范和标准_社交APP,社交直播软件开发怎样才可靠了?
  3. php面向对象的概括图解,简单介绍PHP面向对象
  4. 2019-11-10 秩和奇异的一些概念
  5. JVM内存堆布局图解分析
  6. http method
  7. Django restful framework之 rest接口设计规范
  8. EF 学习 实用脚本
  9. 1250 Fibonacci数列(矩阵乘法快速幂)
  10. Oracle通过OCI批量加载需要注意的问题