java数据结构 第7章--排序算法09-常用排序算法总结和对比!

7.12 常用排序算法总结和对比

7.12.1 一张排序算法的比较图

image.png

桶排序在二叉树后

7.12.2 相关术语解释:

  1. 稳定:如果a 原本在b 前面,而a=b,排序之后a 仍然在b 的前面;

  2. 不稳定:如果a 原本在b 的前面,而a=b,排序之后a 可能会出现在b 的后面;

  3. 内排序:所有排序操作都在内存中完成;

  4. 外排序:由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行;

  5. 时间复杂度: 一个算法执行所耗费的时间。

  6. 空间复杂度:运行完一个程序所需内存的大小。

  7. n: 数据规模

  8. k: “桶”的个数

  9. In-place: 不占用额外内存

  10. Out-place: 占用额外内存

7.12.3 各排序算法简记

1.冒泡排序 BubbleSort

在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一轮比较中:首先比较第1个和第2个数,将小数放前,大数放后;然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。重复第一轮的步骤,直至全部排序完成。

image

2.选择排序 SelectSort

在要排序的一组数中,选出最小的一个数与第一个位置的数交换;然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。

image

3.插入排序 InsertSort

插入排序(Insertion Sorting)的基本思想是:把n 个待排序的元素看成为一个有序表和一个无序表,开始时有

序表中只包含一个元素,无序表中包含有n-1 个元素,排序过程中每次从无序表中取出第一个元素,把它的排

序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。

image

4.希尔排序 ShellSort

希尔排序又叫“缩小增量排序”,先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序,然后取第二个增量d2。其是插入排序改良的算法,希尔排序步长从大到小调整,第一次循环后面元素逐个和前面元素按间隔步长进行比较并交换,直至步长为1,步长选择是关键。

5.归并排序 MergeSort

归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。归并排序中第二步,对两个有序数组排序法则非常简单,同时对两个数组的第一个位置比较大小,将小的放入一个空数组,然后被放入空数组的那个位置的指针往后移一个,然后继续和另一个数组的上一个位置进行比较,以此类推。直到最后任何一个数组先出栈完,就将另外一个数组里的所有元素追加到新数组后面。

​ 归并排序和快速排序有那么点异曲同工之妙,快速排序:是先把数组粗略的排序成两个子数组,然后递归再粗略分两个子数组,直到子数组里面只有一个元素,那么就自然排好序了,可以总结为先排序再递归;归并排序:先什么都不管,把数组分为两个子数组,一直递归把数组划分为两个子数组,直到数组里只有一个元素,这时候才开始排序,让两个数组间排好序,依次按照递归的返回来把两个数组进行排好序,到最后就可以把整个数组排好序。

image

6.快速排序 QuickSort

选择一个基准元素,通常选择第一个元素或者最后一个元素,通过一轮扫描,将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素,此时基准元素在其排好序后的正确位置,然后再用同样的方法递归地排序划分的两部分,直到各区间只有一个数。

image

7.基数排序 RadixSort
  • 时间复杂度:给定n个d位数(即d个关键码,关键码的取值范围为r),基数排序需要比较元素的每一位,则复杂度为O(d(n+r)),其中一轮循环分配时间复杂度为O(n),一轮循环收集时间复杂度为O®,共需要d次循环来进行分配收集,即时间复杂度为O(d(n+r))
  • 基本思想:将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后,数列就变成一个有序序列。

简单分类:

1.插入排序:直接插入排序、二分插入排序、希尔排序

2.选择排序:直接选择排序、推排序

3.交换排序:冒泡排序、快速排序

4.归并排序

5.基数排序

【学习笔记】

java数据结构 第1章-内容框架介绍
java数据结构 第2章-数据结构和算法概述
java数据结构 第3章-稀疏数组和队列
java数据结构 第4章-链表(单链表)
java数据结构 第4章-链表(双向链表)
java数据结构 第5章–栈
java数据结构 第6章–递归
java数据结构 第7章–排序算法01
java数据结构 第7章–排序算法02-冒泡排序
java数据结构 第7章–排序算法03-选择排序
java数据结构 第7章–排序算法04-插入排序
java数据结构 第7章–排序算法05-希尔排序
java数据结构 第7章–排序算法06-快速排序
java数据结构 第7章–排序算法07-归并排序
java数据结构 第7章–排序算法08-基数排序
java数据结构 第7章–排序算法09-常用排序算法总结和对比!
持续更新

【学习资料】
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是我,Zack

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值