排序算法

冒泡排序

简单选择排序

直接插入排序

希尔(shell)排序

快速排序

归并排序

堆排序

归并排序

排序原理:

  1. 尽可能的将一组数据拆分成两个元素相等的子组,并对每一个子组继续拆分,直到拆分后的每个子组的元素个数是1为止。
  2. 将相邻的两个子组进行合并成一个有序的大组;
  3. 不断的重复步骤2,直到最终只有一个组为止。


对最后合并细化分析,核心代码Merge

Java代码

import java.util.Arrays;
public class MergeSort {private static int[] arr;public static void sort(int[] a){arr = new int[a.length];sort(a,0,a.length-1);}private static void sort(int[] a,int lo, int hi){if(lo>=hi) return;int mid = lo + (hi - lo)/2;sort(a,lo,mid);sort(a,mid+1,hi);//合并两个数组merge(a,lo,mid,hi);}private static void merge(int[] a, int lo,int mid ,int hi ){//指向辅助数组的指针。int i = lo;//定义第一个数组的指针,初始指向第一个元素;int p1 = lo;//定义第二个数组的指针,初始指向第一个元素int p2 = mid+1;//比较两个数组指针指向的元素的大小,哪个小,就放入arr数组while(p1<=mid&&p2<=hi){if(a[p1]<a[p2]){arr[i++]=a[p1++];}else{arr[i++]=a[p2++];}}//如果数组二遍历完,数组一没完while(p1<=mid){arr[i++] = a[p1++];}//如果数组一遍历完,数组二没完while(p2<=hi){arr[i++] = a[p2++];}//拷贝数组for (int i1 = lo; i1 <= hi; i1++) {a[i1] = arr[i1];}}public static void main(String[] args) {int[] a = {8, 4, 5, 7, 1, 3, 6, 2};sort(a);System.out.println(Arrays.toString(a));}}

算法复杂度分析

O(nlogn)

归并排序是分治思想的最典型的例子,上面的算法中,对a[lo…hi]进行排序,先将它分为a[lo…mid]和a[mid+1…hi]
两部分,分别通过递归调用将他们单独排序,最后将有序的子数组归并为最终的排序结果。该递归的出口在于如果
一个数组不能再被分为两个子数组,那么就会执行merge进行归并,在归并的时候判断元素的大小进行排序。

用树状图来描述归并,如果一个数组有8个元素,那么它将每次除以2找最小的子数组,共拆log8次,值为3,所以树共有3层,那么自顶向下第k层有2^k个子数组,每个数组的长度为2^(3-k),归并最多需要2^(3-k)次比较。因此每层的比较次数为 2^k * 2^(3-k)=2^3,那么3层总共为 3*2^3。

假设元素的个数为n,那么使用归并排序拆分的次数为log2(n),所以共log2(n)层,那么使用log2(n)替换上面32^3中 的3这个层数,最终得出的归并排序的时间复杂度为:log2(n) 2^(log2(n))=log2(n)*n,根据大O推导法则,忽略底数,最终归并排序的时间复杂度为O(nlogn).

归并排序需要申请额外的数组空间,导致空间复杂度提升,是典型的以空间换时间的操作。

稳定性

稳定的

归并排序在归并的过程中,只有arr[i]<arr[i+1]的时候才会交换位置,如果两个元素相等则不会交换位置,所以它
并不会破坏稳定性,归并排序是稳定的。

八大排序之归并排序(建议与快排一起看)相关推荐

  1. 八大排序算法之快速排序(下篇)(快排的优化+非递归快排的实现)

    目录 一.前言 1.快速排序的实现: 快速排序的单趟排序(排升序)(快慢指针法实现):​ 2.未经优化的快排的缺陷 二.快速排序的优化 1.三数取中优化 优化思路: 2. 小区间插入排序优化 小区间插 ...

  2. 【数据结构与算法】八大排序(中)快速排序 快排居然还能这么优化?快排的非递归该如何写?

  3. SDUT OJ 数据结构实验之排序一:一趟快排

    数据结构实验之排序一:一趟快排 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Descrip ...

  4. C语言排序算法 选择排序 插入排序 快速排序 qsort实现快排 堆排序

    常见排序算法 选择排序 选择排序(Selection sort)是一种简单直观的排序算法. 它的工作原理如下. 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素 ...

  5. sdutacm- 数据结构实验之排序一:一趟快排

    数据结构实验之排序一:一趟快排 TimeLimit: 1000MSMemory Limit: 65536KB SubmitStatistic ProblemDescription 给定N个长整型范围内 ...

  6. 两万字搞定《数据结构》 八大排序 必读(建议收藏)

    前言:本章将介绍常见八大排序包括如下直接插入排序.希尔排序.选择排序.堆排序.冒泡排序.快排.归并排序以及计数排序(基数排序和桶排序面试基本不涉及,本文忽略了,有兴趣的读者可以自行补充),本章内容是重 ...

  7. (十)更快的排序算法(归并、快排、基数)

    目标 1) 使用下列方法将一个数组按升序排序:归并排序.快速排序和基数排序 2) 评估排序的效率,讨论不同的方法的相对效率 目录 9.1 归并排序 9.1.1 归并数组 9.1.2 递归归并排序 9. ...

  8. 排序算法:冒泡和快排 摘自网络

    冒泡排序: 首先我们自己来设计一下"冒泡排序",这种排序很现实的例子就是: 我抓一把沙仍进水里,那么沙子会立马沉入水底, 沙子上的灰尘会因为惯性暂时沉入水底,但是又会立马像气泡一样 ...

  9. 八大排序算法 —— 归并排序

    归并排序 归并算法的理解比较难,是一种区别于插入算法,选择算法和交换算法的一种独特算法,需要逐步理解. 核心思想:归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治( ...

最新文章

  1. android将拦截短信通过邮箱发送,网易邮箱Android客户端推出 加速布局移动互联网...
  2. ubuntu部署java环境
  3. HDFS restful API:关于WebHDFS与HttpFS的区别
  4. boost::mismatch相关的测试程序
  5. 中科大 计算机网络1 课程主要内容大概介绍
  6. Flat Tech html5 前端响应式模板
  7. Java内存运行机制
  8. 虚拟的virtualbox中的ubuntu和外部的xp的共享
  9. 在html种颜色的代码,html颜色代码生成器
  10. 命令行编译java文件
  11. 解决IE11安装时需要“获取更新”(IE11离线安装)
  12. AirServer Mac Airplay投屏工具
  13. 小学计算机课程目录五年级,小学信息技术课程目录.doc
  14. 【Java】Spring init-method和@PostConstruct 原理
  15. 每日LeetCode一道题————有效的数独
  16. 是时候该学会 MMDetection 进阶之非典型操作技能(一)
  17. 解决申请开发者office E5中无法发送手机验证码,reCaptcha加载失败
  18. gbase 8d客户端功能事项
  19. 听说有人要买雅虎 这家公司还有值得让人花钱的地方吗
  20. 七律:冬奥:2022年北京冬奥赞/文:铁哥

热门文章

  1. Dragon Balls
  2. 黑群晖安装Transmission和emby搭建家庭影音娱乐中心服务器(下)
  3. IP地址、子网掩码详解
  4. 720phi10p 和 720p有什么区别_HDMI接口有什么用?HDMI接口相关知识详解
  5. C++运算符重载的实现
  6. 亚信科技运维实习生(笔试)
  7. ESD防静电监控系统在工厂车间的应用
  8. xbox换服务器文件名,破旧国行xbox one换盘升级重生及更换港服
  9. java简易计算机(用栈实现中缀转后缀,计算后缀表达式)
  10. hadoop入门8:自定义OutputFormat,根据需求数据输出不同的路径