排序算法快速记忆

基础概念

1,插入排序(以第一个元素先入序列,然后逐个入序列)

从第一个元素开始,该元素可以认为已经被排序,然后取出下一个元素,从已排序的元素序列从后往前扫描,如果大于就在后面,如果小于就放前面

2,希尔排序(index增量对比,增量递减至1)

1,先选定一个增量(第一次是个数除以二),然后将所有距离为gap的元素分在同一组,进行对比,比如10个数,增量是10/2=5,所以第一个数和第六个数对比,如果第六个比较大,就互换位置,直到第五个被执行完,然后增量=5/2=2,重复该步骤

2,当增量的大小减到1时的排序,等于排序完成

3,选择排序(从候选中挑选入序列)

最简单的做法就是每次从候选中挑选一个最小值放入序列,优化做法是每次从候选中挑选最大和最小值,分别放序列的两头

4,冒泡排序(对比右移动)

从第一数开始,逐个对比,如果比较大,就向右移动一位

5,堆排序(完全二叉树)

堆排序是一种不稳定的排序算法,它利用堆这种数据结构进行排序。堆排序的时间复杂度为O(nlogn),在原数据上进行排序,空间复杂度为 O(1)。但是,由于堆排序过程中必须先构建一个堆,因此需要占用额外的空间来存储堆。

6,快速排序(左右两边指针移动对比,停止指针位互换)

左右端最后一个分别是LR向中间走,但是位置并未变动,当左边走到比自己大的就停止,当右边遇到比自己小的也停止,然后指针的两个下标数据互换,互换结束后继续往前走,当两个指针碰一起,也就是index相同的时候,对比index的数据与两个端的大小,然后进行互换操作。这种算法快,复杂度是n*log2^n

简而言之,就是确定一个数作为基准,然后对比另一边,假设另一半大,就互换,然后基位到了另一边,反过来继续对比。

  • 假如数组是{2,8,7,1,3,5,6,4},以最后一个元素为基准元素,排序后结果是:{2,3,1,4,7,5,6,8}

1.起始指针位在index7,数字是4,对比左边指针位index0,数字是2,2比4小,对比下一位8 =》{2,8,7,1,3,5,6,4}

2.左指针位值 8 比右指针位值 4 大,位置互换,基准跳到左指针index1 =》{2,4,7,1,3,5,6,8}

3.重复一二步骤,左(1,4)比右(6,6)(5,5)都小,比(4,3)大,所以进行一次互换,基准位跳到4 =》{2,3,7,1,4,5,6,8}

4.基准位右指针位值 4)比左指针位值 7)小,互换,基准位跳到2 =》{2,3,4,1,7,5,6,8}

5.基准位左指针位值 4)比右指针位值 1)大,互换,基准位跳到3 =》{2,3,1,4,7,5,6,8}

7,归并排序

归并排序是一种稳定的、基于比较的排序算法,采用分治思想,将待排序列分成若干个子序列,对每个子序列进行内部排序,最后合并各个有序子序列,得到完整的有序序列。归并排序的时间复杂度为 O(nlogn),可以保证排序的稳定性。

总结

  • 插入排序:先从候选中选择一个,然后逐个拿来对比,与新的序列进行对比,然后插入新序列。(需要新增数组)
    选择排序:每次从候选中选择一个最小或者最大值,插入新的序列(需要新增数组)
  • 希尔排序:折中取对比偏移量,逐个根据偏移量进行数据对比和互换,结束后继续折中偏移量(无需新增数组)
  • 冒泡算法:下标位进行遍历对比,直接在原来的列表上进行换位置,注意这里并非固定某一个候选值与其他进行对比。(无需新增数组)
  • 堆排序:不稳定排序,(时间复杂度O(nlogn),空间复杂度为O(1),需新增一个堆)
  • 归并排序:稳定排序,分治思想。(时间复杂度O(nlogn))
  • 快速排序:挑选最后一个作为候选值,先左边逐个对比,遇到比自己大则互换,然后与右边互换位置向左逐个对比,遇到比自己小则互换。相当于拿一个值作为标准,通过左右不断互换的方式让这个标准值的左边比自己小,右边比自己大。所以快速排序得到的结果并非一定是顺序的。

归纳

  • 1,插入排序和选择排序,都是针对数值,讲究的是从原来数组中挑选出来得到一个新数组,一个是拿出来后对比插入,另一个是先对比后直接拿出来放入,都需要创建一个新数组。

  • 2,希尔排序、冒泡排序和快速排序,都是针对下标,一个是偏移对比,一个是逐个对比,最后一个是左右下标偏互换,都是在自身数组上操作。

相关推荐
小灰灰要减肥1 小时前
装饰者模式
java
张铁铁是个小胖子1 小时前
MyBatis学习
java·学习·mybatis
刚学HTML2 小时前
leetcode 05 回文字符串
算法·leetcode
Yan.love2 小时前
开发场景中Java 集合的最佳选择
java·数据结构·链表
椰椰椰耶2 小时前
【文档搜索引擎】搜索模块的完整实现
java·搜索引擎
大G哥2 小时前
java提高正则处理效率
java·开发语言
AC使者2 小时前
#B1630. 数字走向4
算法
冠位观测者2 小时前
【Leetcode 每日一题】2545. 根据第 K 场考试的分数排序
数据结构·算法·leetcode
智慧老师2 小时前
Spring基础分析13-Spring Security框架
java·后端·spring
lxyzcm2 小时前
C++23新特性解析:[[assume]]属性
java·c++·spring boot·c++23