预备知识
我们描述的算法都将是可以互换的。每个算法都将接受包含一些元素的数组;假设所有的数
组位置都包含要被排序的数据,并且假设N为传递到排序例程的元素的个数。
被排序的对象属于Comparable类型。因此我们使用CompareTo方法对输入的数据施加相
容的排序。这是除了赋值运算外,仅有的允许对输入数据进行的操作。在这些条件下进行
的排序叫作基于比较的排序。
插入排序详解
1、算法
在这里,我们先不应基于比较的排序,先通过简单的排序比较完成,便于理解。
插入排序作为最简单的排序方法之一,他是通过N-1趟排序将所有的数据进行排序的。
对于p=0到p=N-1趟,插入排序保证从位置0到位置p之间的元素为已经排好序的元素。
图1-1显示了一个数组经过p次排序后的状态。
图1-1表达了一般的策略。在第p趟,我们将p上的元素向左移动,直到他在前p+1个元素中的正确位置被找到的地方。java代码如下
public static void isort1(int[] a) {
int j;//标记下标
//从数组中第二个元素开始遍历该数组
for(int p=1;p<a.length;p++) {
int tmp = a[p];//记录需要移动的元素的值
//将第p个之前的元素与第p个之前的元素进行比较
for(j=p;j>0&&tmp<a[j-1];j--) {
a[j]=a[j-1];
a[j-1]=tmp;
}
for(int s:a) {
System.out.print(s+" ");
}
System.out.println("\n");
}
}
2、插入排序算法的分析
由于嵌套循环的每一次都花费N次迭代,因此插入排序的时间复杂度为O(N^2),而且这个界是精确的。
另一方面,如果输入数据是已经预先排序的,那么运行的时间为O(N),因为内层for循环的检测总是 立即判断不成立而终止。
3、总结
由上述可知,插入排序的时间复杂度的最坏情况为O(N^2),最好情况为O(N),
平均情况为O(N^2)。空间复杂度为O(1),较稳定。