学习这些算法,不仅仅是要学习使用,更要学习的是其中的思想。
举例
那么说到插入排序,大家可以先想一下,生活中,什么地方会用到插入排序呢?我先来给大家举几个例子:
- 上体育课,会要求按照大小个排队,此时如果大部分人已经排好了队,新来的人在插入式,一般使用的都是插入排序。
- 我们给随机的扑克牌排顺序,也是使用插入排序。
- 大家整理钱包的时候,是不是也会按照插入排序将钱按照大小顺序放起来。
思考
那么插入排序的中心思想是什么呢?
从无序到有序的这个过程,最重要的一个思想是什么呢?
是我们如何看待第一个待排序的元素,插入排序的中心思想,就是将第一个元素,此时它也是唯一一个元素,将它看待成一个有序序列。
一个也是有序的,如此,第二个元素,才可与之相比,并进行排序。
实例
既然了解了生活中的使用,那么我们也来看一下从代码层面,我们应该如何使用插入排序,咱们来看看代码如何实现。
public static void insertionSort(int[] arr){ for(int i=1;i<arr.length;i++){ int j=i; while(j>0 && arr[j] < arr[j - 1]){ arr[j] = arr[j]+arr[j-1]; arr[j-1] = arr[j]-arr[j-1]; arr[j] = arr[j]-arr[j-1]; j--; } } }
假设我们现在有一个待排序数组,从第一个数字来说,假设它已经有序,然后开始给后面的数据排序。
直接插入排序的时间复杂度是O(N2)。假设我们有n个数,外层遍历一次需要O(n),内层需要遍历n-1次,所以它的时间复杂度是O(N2).