算法导论的Java实现----2. 插入排序

1. 插入排序

一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下:
⒈ 从第一个元素开始,该元素可以认为已经被排序
⒉ 取出下一个元素,在已经排序的元素序列中从后向前扫描
⒊ 如果该元素(已排序)大于新元素,将该元素移到下一位置
⒋ 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
⒌ 将新元素插入到下一位置中
⒍ 重复步骤2~5
如果比较操作的代价比交换操作大的话,可以采用二分查找法来减少比较操作的数目。该算法可以认为是插入排序的一个变种,称为二分查找排序。

/*
 *  插入排序
 */
import java.util.Comparator;
public class InsertionSort {

	/**
	 * @param args
	 */
	public static  void insertionSort(T[] a, Comparator comparator)
	{
		for(int j=1;j=0&&comparator.compare(a[i],key)>0)
			{
				a[i+1] = a[i];
				i--;
			}
			a[i+1] = key;
		}
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Integer [] ints = new Integer[] {5,2,4,6,1,3,7,3};
		System.out.println("Before InsertionSort:");
		for(int i:ints)
			System.out.print(i + " ");
		System.out.println();
		insertionSort(ints, new Comparator()
		{
			public int compare(Integer o1, Integer o2)
			{
				// 一定要把 Integer 类型 转换为int 类型,否则排序结果出现错误
				// 此句可以这样写     return o1.intValue() - o2.intValue();
				return (int)(o1-o2);
			}
		});
		System.out.println("After InsertionSort:");
		for(int i:ints)
			System.out.print(i+ " ");
		System.out.println();
	}

}

输出结果:

Before InsertionSort:
5 2 4 6 1 3 7 3 
After InsertionSort:
1 2 3 3 4 5 6 7 

2. 稳定性

  插入排序是在一个已经有序的小序列的基础上,一次插入一个元素。当然,刚开始这个有序的小序列只有1个元素,就是第一个元素。比较是从有序序列的末尾开始,也就是想要插入的元素和已经有序的最大者开始比起,如果比它大则直接插入在其后面,否则一直往前找直到找到它该插入的位置。如果碰见一个和插入元素相等的,那么插入元素把想插入的元素放在相等元素的后面。所以,相等元素的前后顺序没有改变,从原无序序列出去的顺序就是排好序后的顺序,所以插入排序是稳定的。

你可能感兴趣的:(算法导论,插入排序,算法导论)