- 算法
插入排序由N-1趟排序组成。
对于p=1到N-1趟,插入排序保证从位置0到位置p上的元素为已排序状态。
在第p趟,将位置p上的元素向左移动,直到它在前p+1个元素中的正确位置被找到的地方。 - 编程
int[] a = {34,8,64,51,32,21};
public static void insertionSort(int[] a) {
Integer j;//记录下标
for(int p =1;p<a.length;p++) {//插入排序由N-1趟排序组成
Integer tmp=a[p];//第p趟,插入目标值
for(j=p;j>0&&tmp.compareTo(a[j-1])<0;j--)
a[j]=a[j-1];//元素向右移动,下标左移动
a[j]=tmp;//插入
}
for(int p:a) {
System.out.print(p+" ");
}
}
tmp =a[p];行到啊a[j]=tmp;行实现数据移动而没有明显地使用交换。
位置p上的元素储存于tmp,而(在位置p之前)所有更大的元素都被向右移动一个位置。
然后tmp被置于正确的位置上。与二叉堆实现同理。
3.分析
嵌套循环N次迭代,平均运行时间O(N²)。
如果输入数据几乎被排序,那么插入排序运行很快,接近O(N)。
思考:
基础:其算法的精髓在“插入”二字。
分治关联思考:一个数列不断分治,分为数列是1的时候,1个元素的数列绝对是有序。
在数列为1的基础上,插入。(子序列形成有序序列)
过程:与目标值比,较大元素移动。最后停止的位置就是目标下标。目标值“插入”。