码迷,mamicode.com
首页 > 其他好文 > 详细

插入排序

时间:2014-09-27 21:49:00      阅读:294      评论:0      收藏:0      [点我收藏+]

标签:style   http   color   io   os   ar   java   for   文件   

bubuko.com,布布扣

java源码如下:

/**
 * 
 * @author ruikaih
 *
 */
public class InsertSortTest {

	/**
	 * @param args
	 */
	public static void insertionSort(Comparable[] data) {

		for (int index = 1; index < data.length; index++) {

		Comparable key = data[index];
		//定义索引,遍历有序部分,不可直接用index,会修改index,影响外部循环
		int position = index;
		// data[position - 1].compareTo(key) > 0表示升序。
		//data[position - 1].compareTo(key) < 0表示降序
		while (position > 0 && data[position - 1].compareTo(key) > 0) {
		data[position] = data[position - 1];
		position--;
		}
		data[position] = key;
		}
		}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Comparable[] c = { 14, 119, 123, 1, 45, 27, 1115, 21,0 };

		insertionSort(c);

		for (int i = 0; i < c.length; i++)

		System.out.print(c[i]+",");
	}

}


关键点:

  1. 外层循环遍历无序元素,如果待排序元素大于前面的元素则不需调整,反之,循环右移动,直到前面的元素小于自己。

  2. 第一个元素排除,从第二个开始,小于前面元素,循环移动,直到大于前面的元素。

   while (index>0 && data[index -1] > data[index]){

         data[index]=data[index-1]

         index--;

   }

     data[index]=key


一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下:

⒈ 从第一个元素开始,该元素可以认为已经被排序

⒉ 取出下一个元素,在已经排序的元素序列中从后向前扫描

⒊ 如果该元素(已排序)大于新元素,将该元素移到下一位置

⒋ 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置

⒌ 将新元素插入到下一位置中

⒍ 重复步骤2~5

如果比较操作的代价比交换操作大的话,可以采用二分查找法来减少比较操作的数目。该算法可以认为是插入排序的一个变种,称为二分查找排序。

线性插入排序算法的比较次数取决于待排序文件原来的有序程度。如果原始记录的关键字正好为递减排序(最坏情况),那么这时比较次数最多为n(n-1)/2次。即线性插入排序算法的时间复杂度为0(n2)

插入排序

标签:style   http   color   io   os   ar   java   for   文件   

原文地址:http://my.oschina.net/hanruikai/blog/322669

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!