排序算法-课堂笔记

目录

1、类别

2、冒泡排序 Bubble Sort

3、选择排序   

4、插入排序 Insertion Sort

5、希尔排序 Shell Sort / 缩小增量排序

6、合并排序 Merge Sort

7、堆排序 Heap Sort

8、快速排序 Quick Sort

9、计数排序 Counting Sort

10、桶排序 Bucket Sort

11、基数排序 Radix Sort

12、对比复杂度


1、类别

排序算法

比较类排序

——至少O(nlogn)

交换排序冒泡排序——稳定
快速排序

插入排序

简单插入排序——稳定
希尔排序

选择排序

简单选择排序
堆排序

归并排序

——稳定

二路归并排序
多路归并排序

非比较排序

——可优于O(nlogn);

——稳定

计数排序
桶排序
基数排序

稳定:相同的两个数,在排序后,保持排序前的相对顺序。——不稳定,无法保证这一点。

2、冒泡排序 Bubble Sort

1、描述

  • 比较相邻的元素。排列顺序与目标不一致,就交换它们。
  • 从开始第一对到最后一对,做相同工作,这样会得到一个最数在端处。
  • 在除 最数 外的数组中重复上述操作,会得到 新的/剩下 数组里的新最数。重复,直至排序完成。

2、分析

  • 每次迭代,能保证一个最数排好序
  • 迭代次数 n
  • 第i次迭代时间:n-i
  • 总时间 O(n^2)
  • 空间复杂度:O(1)。不需要额外空间
  • 稳定

3、选择排序   

特点:慢。——没有快的可能

1、描述

  • 扫描所有元素,找出最大(或最小)值,取出
  • 重复上一操作,直至所有元素排序完毕

2、分析

  • 最坏和最好情况一样,需要扫描所有元素
  • 迭代次数 n
  • 第i次迭代时间:n-i
  • 总时间 O(n^2)
  • 空间复杂度:O(1)。不需要额外空间
  • 可以稳定——设定 :当值一样,取最早出现的

4、插入排序 Insertion Sort

当排序数量小,是最快的方法。——虽然时间复杂度O(n^2),但它的常数小

1、描述

  • 从第一个元素开始,可以认为该元素已经被排序
  • 取出下一个元素,在已排序的元素序列中,从后向前扫描。
  • 如元素(已排序)大于新元素,将元素移到下一位置
  • 重复上一操作,直至找到已排序元素小于或者等于新元素的位置
  • 将新元素插入到该位置后
  • 重复2~5操作

2、分析

  • 迭代次数 n
  • 第i次迭代时间
    最好情况1
    最差情况i
    平均情况i/2+ O(1)

  • 总时间
最好情况——已排序O(n)
最差情况——逆排序O(n^2)
平均情况O(n^2)
  • 空间复杂度:O(1)。不需要额外空间
  • 可以稳定——设定 :插入一个新数,插到相等值的数后

3、更进

插入时,把一个新元素和一个排好序的序列比较。——可以用二分查找

  • 第i次迭代时间:log i
  • 比较次数:O(nlogn)
  • 但支持二分查找的数据结构,插入操作需要时间 O(n)
  • 比较次数少了,但插入时间多了。仍 O(n^2)

5、希尔排序 Shell Sort / 缩小增量排序

简单插入排序的改进版。

会优先比较距离较远的元素。——与插入排序的不同之处

1、描述

整个待排列序列分割为若干子序列,分别进行直接插入排序

  • 先取一个小于n的整数d1作为第一个增量,把文件的全部记录分组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序
  • 然后,取第二个增量d2 ....
  • .......

           

2、分析

  • 迭代次数 log(n)
  • 平均时间:O(n^1.3)
  • 最坏时间 O(n^2)——可因gap选择策略而不同,有策略可以减至O(n^1.5)以下
  • 空间复杂度:O(1)。不需要额外空间
  • 不稳定

6、合并排序 Merge Sort

分治法的典型应用

1、描述

  • 分:把长度为n的序列,分成两个长度为n/2的子序列
  • 治:对两子序列分别采用合并排序
  • 合:将两个排序好的子序列合并成一个最终的排序序列

2、分析

  • 迭代次数 log n
  • 总时间 O(nlogn)——运行时间很稳定,因合并时间 O(n)
  • 空间 O(n)
  • 稳定

7、堆排序 Heap Sort

特点:第i次迭代时,已找出了最大(或最小)的i个数

            ——用时O( i log(n) )

1、描述

  • 近似完全二叉树
  • 子节点总是小于(或大于)父节点,即最小堆(或最大堆)

2、分析

  • 迭代次数 n
  • 第i次迭代时间:log(i)
  • 总时间 O(nlogn)
  • 不稳定

8、快速排序 Quick Sort

最常用排序算法

1、描述

  • 选择一个支点数,将所有数与这个支点比较
  • 按比较结果,分成小于L,等于M,和大于R三类
  • 在L和R里递归调用前两步,就可以将所有的数排好序

2、分析

  • 迭代次数 
最好情况log n
最坏情况n
  • 第i次迭代时间:<=n
  • 总时间       平均:O(nlogn);最坏O(n^2)
  • 不稳定更快

9、计数排序 Counting Sort

数据分布在某区间,有大量重复

1、描述

  • 遍历数据,每遇到一个值,计数数组里对应的值增加1

2、分析(值的空间为k)

  • 时间复杂度 O(n+k)——线性的,很快
  • 空间复杂度 O(n+k)
  • 稳定

10、桶排序 Bucket Sort

划分多个区间(即桶),桶内排序

——高频细分,低频粗分,区间不用均匀,桶内元素均匀。

1、描述

  • 类似,计数排序

2、分析(通的数量 k)

  • 时间复杂度 O(n+k)

最坏情况,所有数集中在一个桶中,排序时间O(nlogn)

  • 空间复杂度 O(n+k)

11、基数排序 Radix Sort

比桶排序,更适合区间很大的情况

1、描述

  • 先根据个位,划分10个桶,桶内排序
  • 再根据十位.....
  • ......

2、分析(类别个数 k——多位数排序,k=10;排序次数 d——多位数排序,d=位数)

  • 每一次排序需要时间 O(n+k)
  • 排序时间 O(d*(n+k))
  • 空间复杂度 O(n+k)

12、对比复杂度

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值