本篇介绍第二种排序算法,插入排序。

插入排序一般举的例子是“整理手牌”,从牌堆中摸一张牌,放在手里,按照顺序整理好,一般是将新摸到的牌和手中已有的牌依次比较,可以从小到大也可以从大到小。然后选择合适的位置“插入”。

先看完整的代码实现,这个代码是从大到小(逆序)的方式进行比较的:

	public static void InsertSort0(){
		int[] a={5,1,4,8,3,9,0,2,7,6};
		//1 4 5 8 
		for(int i=1;i<a.length;i++){
			int temp = a[i];
			int j=i-1;
			while(j>=0&&temp<a[j]){
				a[j+1]=a[j];
				j--;
			}
			a[j+1]=temp;
		}
		
		for(int i=0;i<a.length;i++){
			System.out.print(a[i]+ " ");
		}
	}

 我们先分析一下,这个算法的大的流程。先选定一个待排序的元素,然后找到一个合适的位置,把元素插入进去。

核心的就是找到合适的位置。

第一步:在一个已经排好序的数组中,找到一个位置,使得当前要插入的元素放入后,其左边的都不大它,其右边的都不小于它。

这个算法用一个循环就可以搞定:

	public int GetCorrectIndex(int[] a){
		int temp = a[a.length-1];
		int j = a.length-2;
		while(j>=0 && temp<a[j]){
			a[j+1] = a[j];
			j--;
		}
		
		return j+1;
	}

 这个是在以当前的数组的最后一个元素为基准,向前进行搜索。改进为“人为指定”,增加一个重载版本:

	public static int GetCorrectIndex(int[] a,int endIndex){
		int temp = a[endIndex];
		int j = endIndex-1;
		while(j>=0 && temp<a[j]){
			a[j+1] = a[j];
			j--;
		}
		//语义:直到(条件不满足时)。。。才
		return j+1;
	}

 这个函数,输入参数是数组a以及,这个数组中待排序的元素的索引endIndex,也就是说endIndex之前的元素都是有序的。

返回值是这个元素中合适的位置。这个位置就是带排序的元素应插入的位置。

第二步:选定一个待排序的元素,并将带排序的元素插入到合适位置:

	public static void InsertSort(int a[]){
		for(int i=1;i<a.length;i++){
			int temp=a[i];
			int endIndex=i;
			int position = GetCorrectIndex(a,endIndex);
			a[position]=temp;
		}
	}

 经过这两部,就完成了插入排序,完整代码如下:

package asen.yang;

public class insertSort {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//InsertSort0();
		
		int[] a={5,1,4,8,3,9,0,2,7,6};
		InsertSort(a);
		for(int i=0;i<a.length;i++){
			System.out.print(a[i]+ " ");
		}
	}
	
	public int GetCorrectIndex(int[] a){
		int temp = a[a.length-1];
		int j = a.length-2;
		while(j>=0 && temp<a[j]){
			a[j+1] = a[j];
			j--;
		}
		
		return j+1;
	}
	
	public static int GetCorrectIndex(int[] a,int endIndex){
		int temp = a[endIndex];
		int j = endIndex-1;
		while(j>=0 && temp<a[j]){
			a[j+1] = a[j];
			j--;
		}
		//语义:直到(条件不满足时)。。。才
		return j+1;
	}
	
	public static void InsertSort(int a[]){
		for(int i=1;i<a.length;i++){
			int temp=a[i];
			int endIndex=i;
			int position = GetCorrectIndex(a,endIndex);
			a[position]=temp;
		}
	}
	
	public static void InsertSort0(){
		int[] a={5,1,4,8,3,9,0,2,7,6};
		//1 4 5 8 
		for(int i=1;i<a.length;i++){
			int temp = a[i];
			int j=i-1;
			while(j>=0&&temp<a[j]){
				a[j+1]=a[j];
				j--;
			}
			a[j+1]=temp;
		}
		
		for(int i=0;i<a.length;i++){
			System.out.print(a[i]+ " ");
		}
	}

}

 

posted on 2018-04-11 14:32  Sempron2800+  阅读(145)  评论(0编辑  收藏  举报