归并排序

归并算法的理解比较难,是一种区别于插入算法,选择算法和交换算法的一种独特算法,需要逐步理解。
核心思想:归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。

图解(网上盗用):
分治法
“分”的步骤:

“治”的步骤:

详细“治”的步骤:


(1)稳定性
 归并排序是一种稳定的排序。
(2)存储结构要求
 可用顺序存储结构。也易于在链表上实现。
(3)时间复杂度
 对长度为n的文件,需进行趟二路归并,每趟归并的时间为O(n),故其时间复杂度无论是在最好情况下还是在最坏情况下均是O(nlgn)。
(4)空间复杂度
  需要一个辅助向量来暂存两有序子文件归并的结果,故其辅助空间复杂度为O(n),显然它不是就地排序。
注意:若用单链表做存储结构,很容易给出就地的归并排序
归并排序是稳定排序,它也是一种十分高效的排序,能利用完全二叉树特性的排序一般性能都不会太差。java中Arrays.sort()采用了一种名为TimSort的排序算法,就是归并排序的优化版本。从上文的图中可看出,每次合并操作的平均时间复杂度为O(n),而完全二叉树的深度为|log2n|。总的平均时间复杂度为O(nlogn)。而且,归并排序的最好,最坏,平均时间复杂度均为O(nlogn)。

算法实现代码:

import java.util.*;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int []data  = new int[8];for(int i= 0;i<data.length ;i++){data[i] = sc.nextInt();}//归并排序mergeSort(data ,0 ,data.length-1);for(int i = 0;i<data.length ;i++){System.out.print(data[i]+" ");}}//归并排序public static int[] mergeSort(int[] data,int low,int high){int mid = (low+high)/2;if(low<high){mergeSort(data,low,mid);mergeSort(data,mid+1,high);//左右归并merge(data,low,mid,high);}return data;}//归并排序的辅助方法public static void merge(int[] data, int low, int mid, int high) {int[] temp = new int[high-low+1];int i = low;int j = mid+1;int k = 0;// 把较小的数先移到新数组中while(i<=mid && j<=high){if(data[i]<data[j]){temp[k++] = data[i++];//说明:temp[k++] = temp[k] ,只是在temp[k++]之后k的值加1//说明:temp[++k] = temp[k+1],temp[++k]之后k的值加1}else{temp[k++] = data[j++];}}// 把左边剩余的数移入数组while(i<=mid){temp[k++] = data[i++];}// 把右边边剩余的数移入数组while(j<=high){temp[k++] = data[j++];}// 把新数组中的数覆盖nums数组for(int x=0;x<temp.length;x++){data[x+low] = temp[x];}}
}

八大排序算法 —— 归并排序相关推荐

  1. 八大排序算法(java实现) 冒泡排序 快速排序 堆排序 归并排序 等

    八大排序算法 一.直接插入 - 1.基本思路 - 2.代码实现 - 3.时间复杂度和空间复杂度 二.希尔排序 - 1.基本思路 - 2.代码实现 - 3.时间复杂度和空间复杂度 三.简单选择 - 1. ...

  2. 冒泡和快速排序的时间复杂度_java 八大排序算法 冒泡排序 快速排序 堆排序 归并排序 等...

    八大排序算法 一.直接插入 1.基本思路 在要排序的一组数中,假设前面(n-1) [n>=2] 个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的.如此反复循环 ...

  3. python 排序算法 简书_Python---简析八大排序算法

    前言 1 .排序的概念 排序是计算机内经常进行的一种操作,其目的是将一组"无序"的记录序列调整为"有序"的记录序列. 排序分为内部排序和外部排序. 若整个排序过 ...

  4. 图解八大排序算法——我见过的最详细的讲解(转)

    一.分类 1.内部排序和外部排序 内部排序:待排序记录存放在计算机随机存储器中(说简单点,就是内存)进行的排序过程. 外部排序:待排序记录的数量很大,以致于内存不能一次容纳全部记录,所以在排序过程中需 ...

  5. 八大排序算法的 Python 实现

    八大排序算法的 Python 实现 本文用Python实现了插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 描述 插入排序的基本操作就是将一个数据插入 ...

  6. 精通八大排序算法系列:二、堆排序算法

    精通八大排序算法系列:二.堆排序算法 作者:July .二零一一年二月二十日 本文参考:Introduction To Algorithms,second edition. ------------- ...

  7. 八大排序算法的java实现

    八大排序算法的java实现 有时间再贴算法分析图 JDK7的Collections.sort()的算法是TimSort, 适应性的归并排序, 比较晦涩难懂, 这里没有实现 public class m ...

  8. 八大排序算法(理论和动态图)

    八大排序算法 一.冒泡排序 二.选择排序 三.快速排序 四.归并排序 五.堆排序 六.直接插入排序 七.希尔排序 八.基数排序 排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或 递减的排 ...

  9. 八大排序算法图文讲解

    排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 常见的内部排序算法有:插入排序.希尔排序. ...

最新文章

  1. redis bind连不上的坑
  2. 用加法器构造能够实现连续加法的电路
  3. 牛客网(剑指offer) 第二十五题 复杂链表的复制
  4. jQuery dataTable 操作个人使用总结
  5. 论文阅读:SSD: Single Shot MultiBox Detector
  6. linux之学习linux系统相关的书籍
  7. Linux 命令之 source -- 在当前Shell环境中从指定文件读取和执行命令
  8. c语言队列原理的实现,c印记(十二):队列queue原理与实现
  9. SpringBoot2.0基础案例分类总结,后续更新计划说明
  10. CSS基础「一」基础选择器 / 字体属性 / 文本属性 / 三种样式表
  11. C语言及程序设计进阶例程-12 结构体成员的引用
  12. Nginx+Lua 积累
  13. Oracle控制文件操作
  14. 用MATLAB求一阶微分方程(组)数值解
  15. 知网靠论文一年收费10多亿
  16. 湖南计算机专修学院20年同学聚会,20年后的一次同学聚会
  17. HarmonyOS(鸿蒙系统)体系
  18. 网络爬虫——中国大学排名数据抓取
  19. 查最近一条数据SQL(多条记录时)
  20. 简单工厂 工厂方法 抽象工厂

热门文章

  1. 面经|小米-未来星-数据科学家|一面|70min
  2. 【Keras】TensorFlow Serving
  3. 牛客挑战赛36 - 纸飞机
  4. WOKWI - Arduino/ESP32/树莓派等在线Pico仿真学习平台
  5. 阿里云国际服务器ECS特性与优势
  6. JavaScript的基础教程
  7. 中兴oltc320用户手册_olt中兴网管 中兴oltc320用户手册
  8. 肇庆学院与韶关学院计算机专业,韶关学院,肇庆学院,嘉应学院,湛江师范学院,惠州学院哪个好,最好将其排名...
  9. python数据分析的回归方程的简单讲解
  10. SparkStreaming-相关窗口操作