关于O(n^2) 的排序算法中,插入排序是不得不提的一种。相比较于冒泡排序,选择排序这些真正的O(n^2)算法,插入算法在一些情况下的性能会比一些高级排序算法如归并排序,快速排序更加高效,而这些情况我们会在下面的一些情况中进行讨论。
首先,既然要写一个插入排序算法,我们第一个要做的自然是理解插入排序的过程是怎么样的。
第一步,给定一个随机产生的数组,从第二个数进行遍历;
第二步,将遍历到的数与前一个数进行比较,如果这个数小于前一个数,则进行交换,再与前面的数进行比较,若小于,则再交换,一直比较到第一个数;
第三步,如果遍历的数大于前一个数,不交换,继续向后遍历;
代码示例:
public class insertionSort {//插入排序
public static void sort(Comparable[] arr){ int n = arr.length; for(int i=1; i<n; i++){ for(int j=i; j>0; j--){ if(arr[j].compareTo(arr[j-1])<0){//如果arr[j]<arr[j-1] swap(arr, j , j-1);//交换两者 } else break; } } }
public static void swap(Object arr[], int x, int y){ Object temp = arr[y]; arr[y] = arr[x]; arr[x] = temp; }
}
可能有同学要问了,你那个sort(Comparable[] arr)是什么意思呢?
其实,这里是可以写成sort(int [] arr),这样就好理解了,就是一个int类型的数组嘛。
但是,我们排序的不可能永远是一个int类型的数组,有可能我们需要排序浮点型的数组,有可能我们需要根据学生的成绩来对学生进行排名......
所以,我们就不能使用普通的比较arr[j]<arr[j-1]这种方法,来对学生的成绩进行排序,这里使用了compareTo()这种方法,我们将具体的比较方法放在了compareTo()方法中,而Comparable[] 则表示这里引用的是一个实现了Comparable接口的类,里面实现了compareTo()方法,下面是一个例子:
class Student <