学习这些算法,不仅仅是要学习使用,更要学习的是其中的思想。
举例
那么说到选择排序,大家可以先想一下,生活中,什么地方会用到选择排序呢?我先来给大家举几个例子:
- 打麻将的时候,咱们是不是先把所有牌都展开,然后用选择排序的思想去排顺序呢?
- 还是扑克牌,当我们整理扑克牌是直接按照顺序来排序,每次都选择最小的牌来放。
思考
那么选择排序的中心思想是什么呢?
从无序到有序的这个过程,最重要的一个思想是什么呢?
是我们如何看待第一个待排序的元素,选择排序的中心思想,就是将第一个元素,此时将它看成符合条件的一个元素,比如将它看成最大的,或者最小的,然后用它去和后面的去对比。
第一个,就是最大的一个。如此,第二个元素,才可与之相比,并进行排序。
实例
既然了解了生活中的使用,那么我们也来看一下从代码层面,我们应该如何使用选择排序,咱们来看看代码如何实现。
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)