算法真的不难! (排序)--选择排序
选择排序是一种最简单, 最直观并且不稳定的排序算法,也是大多数人能第一反应的排序方式,当然因为比较直观,带来的后果就可能是排序算法带来的时间复杂度比较差。
复杂度分析
—
1、选择排序算法的平均已经最坏时间复杂度都为 O(n^2),不管是什么数组放进去排序都是相同的比较次数 n(n-1) / 2, 也就是 O(n^2)。
2、交换操作根据数组的排序情况有区别,最好的情况是数组已经全部排序好,交换次数为 0,最坏的情况为数组完全逆序,交换次数为 n-1。
一般用到排序的情况是不会选择 “选择排序” 这种各方面性能都比较差的算法,只不过学习算法不能只知道某一种算法,而是性能不是很好的算法也要作为了解,知道为什么性能会比常用的算法差,差在哪里。这样在实际运用的时候能有自己的判断与选择。
选择排序的工作原理
—
选择一个数组不断循环,每次循环找出当前循环中最小的元素,并和当前要交换的元素进行交换。
例子
—
现在有一组元素[5, 1, 6, 1, 9, 4, 7, 2],第一次要交换的元素为 5,在剩下的元素中循环找出最小的元素 1,循环完做交换 [1, 5, 6, 1, 9, 4, 7, 2]。
第二次要交换的元素为 5,和第一次一样在去除第一个元素之后剩下的元素中循环找出最小元素 1,循环完交换[1, 1, 6, 5, 9, 4, 7, 2]。。。
完整的交换流程参考下图 -->
代码实现
—
--Java
public static void sort(Comparable[] a) {
int size = a.length;
for (int i = 0; i < size; i++) {
// 每次循环找到最小的元素
int min = i;
for (int j = i; j < size; j++) {
if (a[j].compareTo(a[min]) < 0) {
min = j;
}
}
// 每一次比较找到最小的元素以后做交换
Comparable temp = a[min];
a[min] = a[i];
a[i] = temp;
}
}
--Python
def sort(self, arr: List[int]) -> int:
for i in range(len(arr) - 1):
minIndex = i
for j in range(i+1, len(arr)):
if arr[minIndex] > arr[j]:
minIndex = j
if i == minIndex:
pass
else:
arr[i], arr[minIndex] = arr[minIndex], arr[i]
print(arr)
return arr
算法 |
平均时间复杂度 | 最坏时间复杂度 | 最优时间复杂度 | 空间复杂度 |
选择排序 |
О(n²) | O(n²) |
O(n²) | 总共О(n),需要辅助空间O(1) |
-END-