文章目录
7.12 常用排序算法总结和对比
7.12.1 一张排序算法的比较图
桶排序在二叉树后
7.12.2 相关术语解释:
-
稳定:如果a 原本在b 前面,而a=b,排序之后a 仍然在b 的前面;
-
不稳定:如果a 原本在b 的前面,而a=b,排序之后a 可能会出现在b 的后面;
-
内排序:所有排序操作都在内存中完成;
-
外排序:由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行;
-
时间复杂度: 一个算法执行所耗费的时间。
-
空间复杂度:运行完一个程序所需内存的大小。
-
n: 数据规模
-
k: “桶”的个数
-
In-place: 不占用额外内存
-
Out-place: 占用额外内存
7.12.3 各排序算法简记
1.冒泡排序 BubbleSort
在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一轮比较中:首先比较第1个和第2个数,将小数放前,大数放后;然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。重复第一轮的步骤,直至全部排序完成。
2.选择排序 SelectSort
在要排序的一组数中,选出最小的一个数与第一个位置的数交换;然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。
3.插入排序 InsertSort
插入排序(Insertion Sorting)的基本思想是:把n 个待排序的元素看成为一个有序表和一个无序表,开始时有
序表中只包含一个元素,无序表中包含有n-1 个元素,排序过程中每次从无序表中取出第一个元素,把它的排
序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。
4.希尔排序 ShellSort
希尔排序又叫“缩小增量排序”,先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序,然后取第二个增量d2。其是插入排序改良的算法,希尔排序步长从大到小调整,第一次循环后面元素逐个和前面元素按间隔步长进行比较并交换,直至步长为1,步长选择是关键。
5.归并排序 MergeSort
归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。归并排序中第二步,对两个有序数组排序法则非常简单,同时对两个数组的第一个位置比较大小,将小的放入一个空数组,然后被放入空数组的那个位置的指针往后移一个,然后继续和另一个数组的上一个位置进行比较,以此类推。直到最后任何一个数组先出栈完,就将另外一个数组里的所有元素追加到新数组后面。
归并排序和快速排序有那么点异曲同工之妙,快速排序:是先把数组粗略的排序成两个子数组,然后递归再粗略分两个子数组,直到子数组里面只有一个元素,那么就自然排好序了,可以总结为先排序再递归;归并排序:先什么都不管,把数组分为两个子数组,一直递归把数组划分为两个子数组,直到数组里只有一个元素,这时候才开始排序,让两个数组间排好序,依次按照递归的返回来把两个数组进行排好序,到最后就可以把整个数组排好序。
6.快速排序 QuickSort
选择一个基准元素,通常选择第一个元素或者最后一个元素,通过一轮扫描,将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素,此时基准元素在其排好序后的正确位置,然后再用同样的方法递归地排序划分的两部分,直到各区间只有一个数。
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-常用排序算法总结和对比!
持续更新
【学习资料】
- 视频:尚硅谷Java数据结构与java算法(Java数据结构与算法)
- github:点击跳转