相关博客:

排序算法:冒泡排序、插入排序、选择排序、希尔排序

排序算法:归并排序、快速排序

排序算法:桶排序、计数排序、基数排序

排序算法:堆排序

十大排序算法小结


一、归并排序:

1、工作原理:

归并排序的采用分治思想,如果要排序一个数组,我们先把数组从中间分成前后两个部分,然后对前后两个部分分别进行排序,再将排好序的两部分合并在一起,这样整个数组就都有序了。

2、动图演示:

3、Java代码实现:

public class MergeSort {//归并排序:public void mergeSort(int[] a,int p,int r){//递归终止条件if(p>=r) return;int q=(p+r)/2;//取数组的中间点mergeSort(a,p,q);//对前半部分进行排序mergeSort(a,q+1,r);//对后半部分进行排序merge(a, p, q, r);//合并前后两个部分}//merge()函数是归并排序的重点public void merge(int[] a,int p,int q,int r){//初始化变量:i表示前半部分的下标,j表示后半部分的下标,k表示临时数组的下标int i=p;int j=q+1;int k=0;int[] tmp = new int[r-p+1];while(i<=q && j<=r){if(a[i]<=a[j]){tmp[k++]=a[i++];}else{tmp[k++]=a[j++];}}//将剩余数据拷贝到临时数组中for(;i<=q;i++) tmp[k++]=a[i];for(;j<=r;j++) tmp[k++]=a[j];//将tmp临时数组拷贝回原数组for(int x=0;x<r-p+1;x++) a[p+x]=tmp[x];}
}

4、算法分析:

(1)归并排序是一种稳定的排序算法;

(2)最好、最好、平均时间复杂度都是O(nlogn)。

(3)空间复杂度是O(n),所以不是原地排序。这也是归并排序的一个致命弱点。


二、快速排序:

1、工作原理:

快速排序也是利用分治思想。如果要排序一组数据,我们先选择这组数据中任意一个数据作为分区点pivot,然后遍历这组数据,将小于分区点pivot的放到左边,大于分区点pivot的放到右边,将pivot放到中间。然后再分别对左右两部分进行排序。

2、图片演示:

3、Java代码实现:

public class QuickSort {public void quickSort(int[] a,int p,int r){//递归终止条件:if(p>=r) return;//获取分区点:int q=partition(a,p,r);quickSort(a,p,q-1);//对左分区进行排序quickSort(a,q+1,r);//对右分区进行排序}//返回分区点,快速排序的核心:public int partition(int[] a,int p,int r){int i=p;int pivot = a[r];for(int j=p;j<=r;j++){if(a[j]<pivot){swap(a,i,j);i++;}}swap(a, i, r);return i;}public void swap(int[] a,int x,int y){int temp=a[x];a[x]=a[y];a[y]=temp;}
}

其中,快速排序的核心就是paitition()分区函数,它的过程如下图所示:

4、算法分析:

(1)快速排序是一种原地排序,空间复杂度为O(1)。

(2)快速排序是一种不稳定算法。

(3)快速排序是的最好时间复杂度、平均时间复杂度为O(nlogn)。但是在极端情况下,如果数组中的数据原来就是有序的,比如1,3,5,6,8,如果我们每次选择最后一个元素作为pivot,那每次分区得到的两个区间就是不均等的,我们需要大约进行n次分区操作,才能完成快排的整个过程,每次分区我们平均要扫描大约n/2个元素,这时时间复杂度为O(n^2),也就是最坏时间复杂度。


三、小结:归并与快排的区别:

(1)归并排序和快速排序都是用分治的思想,代码都是通过递归来实现的,但是归并排序的核心是merge()合并函数,而快速排序的核心是partition()分区函数。归并排序的处理过程是从下到上,先处理子问题,然后再合并。而快速排序的处理过程正好相反,它的处理过程是从上到下的,先分区,然后再处理子问题。这两种排序的处理过程如下图所示:

(2)归并排序算法是一种任何情况下时间复杂度都比较稳定的排序算法,时间复杂度都是O(nlogn);快速排序算法最坏情况下时间复杂度为O(n^2),但是平均时间复杂度都是O(nlogn),不仅如此,快速排序时间复杂度退化到O(n^2)的概率非常小,我们可以通过合理选择pivot来避免这种情况。

(3)归并排序不是原地排序算法,空间复杂度比较高,为O(n);快速排序是原地排序算法,空间复杂度为O(1)。

(4)归并排序是稳定的算法,快速排序不稳定。

排序算法:归并排序、快速排序相关推荐

  1. 【排序算法】快速排序(C语言)

    [排序算法]-- 快速排序 目录 一.快速排序的单趟排序 1. 霍尔法 2. 挖坑法 3. 前后指针 二.快速排序 1. 排序步骤 2. 排序完整步骤图 3. 快速排序代码 3.1 递归实现 3.2 ...

  2. 十大经典排序算法-归并排序算法详解

    十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...

  3. 十大排序算法之快速排序(两种方法)

    十大排序算法之快速排序 本文采用Java书写选择排序,其他语言类似可以借鉴着写 思想:在待排序序列中选择一个分割元素,将待排序序列中所有比分割元素关键字小的元素移动到分割元素左侧位置:将待排序序列中所 ...

  4. 排序算法之----快速排序(快速上手快速排序)

    排序算法之----快速排序(快速上手快速排序) 何为快速排序算法? 快速排序的基本思想又是什么? 其实很简单: 快速排序的基本思想是 1.先从数列中取出一个数作为基准数(这里我们的算法里面取数组最右边 ...

  5. php1到5000排序,常用的排序算法(一)--快速排序(PHP实现)

    常用的排序算法系列 快速排序 假设当前需要从小到大进行排序,快速排序的核心思路是,从当前数组中,找到一个元素作为基准比较值(key),分别从两个方向进行比较.从后往前找,比key小元素放在数组前面.然 ...

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

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

  7. python排序算法——归并排序(附代码)

    python排序算法 --归并排序 文章目录 python排序算法 --归并排序 一.前言 二.算法描述 三.代码实现 总结 一.前言 相关知识来自<python算法设计与分析>.初级排序 ...

  8. 排序算法(5)快速排序

    排序算法(5)快速排序 思想:递归,分治法. 1.先从数列中取出一个数作为基准数. 2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边. 3.再对左右区间重复第二步,直到各区 ...

  9. Python排序算法(二) 快速排序、希尔排序、归并排序

    这篇文章有的排序算法是:快速排序.希尔排序.归并排序. 快速排序 ''' 快速排序 '''def quick_sort(aList, first, last):if first >= last: ...

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

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

最新文章

  1. 全球及中国生物降解塑料行业应用需求前景及竞争态势研究报告2021版
  2. USTC English Club Note20171012(4)
  3. 机器学习A-Z~简单线性回归
  4. mysql jdbc 批量_MYSQL 之 JDBC(十四):批量处理JDBC语句提高处理效率
  5. 数据结构:(2)什么是数据结构
  6. enum should not be used as an identifier since it is a reserved keyword from source level 1.5 on
  7. PHP判断手机横向,H5横竖屏检测的方法
  8. [Java] 蓝桥杯ADV-158 算法提高 新建Microsoft Word文档
  9. MacOS下搭建Fabric开发环境
  10. HTML5 Security Cheatsheet
  11. 全国计算机建模三等奖,喜报 | 建院学子喜获2019年第十三届全国大学生结构设计竞赛三等奖...
  12. jsp四大作用域介绍
  13. 深度讲解VIEWPORT和PX是什么
  14. 小程序--计算器demo
  15. CSS 学习笔记 - 盒模型
  16. pyautogui模拟鼠键
  17. 02用d编程写与写行类型
  18. docker容器挂载权限问题 导致日志文件不生成
  19. 浅谈2018年的MarTech技术栈
  20. matlab sift乘积量化,PQ(乘积量化)应用于ANN算法原理和代码解读

热门文章

  1. 大连海事学院计算机研究生多少分,大连海事大学计算机或软件工程研究生多少分能录取...
  2. NeurlPS 2021论文预讲会议题全公开,4大主题和25场报告等你来
  3. 亚马逊资深首席科学家李沐:工作这五年
  4. java实验7线程2020.5.28
  5. 动态规划-KMP字符匹配算法
  6. Show Attend and Tell的词表
  7. python中list是什么意思_python中list和list [:]有什么区别?
  8. python图像检测_如何用Python检测图像中的矩形项
  9. 08 | 替换策略: 缓存满了怎么办?
  10. FineReport——设计时无相关数据库查看权限,使用对应数据库解决方案