学习这些算法,不仅仅是要学习使用,更要学习的是其中的思想。
举例
那么说到选择排序,大家可以先想一下,生活中,什么地方会用到选择排序呢?我先来给大家举几个例子:
- 打麻将的时候,咱们是不是先把所有牌都展开,然后用选择排序的思想去排顺序呢?
- 还是扑克牌,当我们整理扑克牌是直接按照顺序来排序,每次都选择最小的牌来放。
思考
那么选择排序的中心思想是什么呢?
从无序到有序的这个过程,最重要的一个思想是什么呢?
是我们如何看待第一个待排序的元素,选择排序的中心思想,就是将第一个元素,此时将它看成符合条件的一个元素,比如将它看成最大的,或者最小的,然后用它去和后面的去对比。
第一个,就是最大的一个。如此,第二个元素,才可与之相比,并进行排序。
实例
既然了解了生活中的使用,那么我们也来看一下从代码层面,我们应该如何使用选择排序,咱们来看看代码如何实现。
public static void selectSort(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
int min = i;
for (int j = i + 1; j < arr.length; j++) {
if (arr[j] < arr[min]) {
min = j;
}
}
if (min != i) {
arr[min]=arr[min]+arr[i];
arr[i]=arr[min]-arr[i];
arr[min]=arr[min]-arr[i];
}
}
}
从我们的代码来看,有两层循环,而且比较次数永远都是那么多,从交换来看,极好情况下,无须交换,极差情况下,需要交换n-1次,总的来说,时间复杂度为O(n2)
后续
笑死,这代码也有问题,不过我已经改了,这会儿可以运行了。
2022.11.25