如何评价一个排序算法
1.时间复杂度
a.最好情况
b.最坏情况
c.平均情况
d.系数和低阶项
2.空间复杂度
原地(store in place)排序:特指空间复杂度为O(1)的排序。
3.稳定性
稳定性:数据集中”相等”的元素,如果排序前和排序后的相对次序不变,那么这个排序就是稳定的。
排序算法
冒泡法:Bubble Sort
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-401JEiK7-1644818712278)(https://upload.wikimedia.org/wikipedia/commons/3/37/Bubble_sort_animation.gif)]
是一种简单的[排序算法]。它重复地走访过要排序的[数列],一次比较两个元素,如果它们的顺序错误就把它们交换过来
这个算法的名字由来是因为小的元素会经由交换慢慢”浮”到数列的顶端,就像水中的气泡会浮到水面上一样。故取名为”冒泡排序”。
性能分析:
-
最佳时间复杂度:O(n),比较n-1次,交换0次
-
最坏时间复杂度:O(n^2),比较:n(n-1)/2交换:n(n-1)/2
-
平均时间复杂度:O(n^2),
-
辅助空间:O(1)
-
稳定性:稳定
-
有序度:数组中有序元素对的个数
-
逆序度:数组中逆序元素对的个数
-
满有序度:数组排好序后的有序度。假设数组有n个元素,满有序度 = n(n-1)/2
-
公式: 满有序度 = 有序度 + 逆序度
-
有序元素对:arr[i] <= arr[j], i < j
-
逆序元素对:arr[i] > arr[j], i < j
选择排序:Selection sort
表现最稳定的排序算法之一,因为无论什么数据进去都是O(n2)的时间复杂度,所以用到它的时候,数据规模越小越好。唯一的好处可能就是不占用额外的内存空间了吧。
它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
性能分析
- 时间复杂度:O(n^2)
对于选择排序来说,无论什么数据(有序或者无序),经过相同的操作之后都会达到有序。所以没有最好情况和最坏情况之分。
比较:1 + 2 + … + (n-1) = n(n-1)/2
交换:n - 1
-
空间复杂度: O(1)
-
稳定性: 不稳定 (元素会发生长距离的交换)
插入排序:Insertion-Sort
是一种简单直观的[排序算法]。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入
工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。故名为”插入排序”。
性能分析
- 时间复杂度
最好情况:数组有序。O(n)
比较:n-1;
交换:0
-
空间复杂度 O(1)
-
稳定性:稳定
最好 | 最坏 | 平均 | 空间复杂度 | 稳定性 | |
---|---|---|---|---|---|
冒泡 | O(n) | O(n^2) | O(n^2) | O(1) | 稳定 |
选择 | O(n^2) | O(n^2) | O(n^2) | O(1) | 不稳定 |
插入 | O(1) | O(n^2) | O(n^2) | O(1) | 稳定 |
n^2) | O(n^2) | O(n^2) | O(1) | 不稳定 |
| 插入 | O(1) | O(n^2) | O(n^2) | O(1) | 稳定 |