系列文章目录
一、直接插入排序InsertSort
基本思想:每次将一个待排序的元素插入到前面已经排好的子序列当中,直至全部元素插入完成
1.分析
数组共分为3部分:有序序列,待排序元素,无序序列
首先,初始状态时,有序序列为a[0],整个过程会将a[1······n-1]
依次插入到前面已排好序的子序列当中
(a[n-1]为数组的最后一个元素,即a.length-1)
过程中为
2.代码
代码如下(示例):
import edu.princeton.cs.algs4.StdOut; //算法第四版中的自己的库
//直接插入排序
public class Insertion {
public static void sort(Comparable[] a)
{
for(int i=1; i<a.length; i++) //a[1]开始,a[a.length-1]结束
{
for(int j=i-1; j>=0&& less(a[j+1],a[j]);j--)
exch(a,j+1,j);
}
}
//v < w? 比较大小
private static boolean less(Comparable v, Comparable w) {
return v.compareTo(w) < 0;
}
//交换 a[i] 和a[j]
private static void exch(Comparable[] a , int i,int j) {
Comparable t=a[i];
a[i] = a[j];
a[j] = t;
}
摘自书中的两句话:
1、在 Java中,元素通常都是对象,对主键的抽象描述则是通过一种内置的机制(请见2.1.1.4节中的Comparable接 口)来完成的。
2、大多数情况下,我们的排序代码只会通过两个方法操作数据:less( )方法对元素进行比较,exch()方法将元素交换位置。exch ()方法的实现很简单,通 过Comparable接口实现less( ) 方法也不困难。将数据操作限制在这两个方法中使得代码的可读性和可移植性更好,更容易验证代码的正确性、分析性能以及排序算法之间的比较。