插入排序的优化算法

插入排序会将之前的所有的比它大的元素进行两两交换(从小到大排列的排序),会增加一些交换时间,降低运行效率,下面我们来讨论一下它的优化算法,

不是进行两两交换,而是把当前待插入的元素取出,让当前元素与之前的所有元素进行一一比较,前一个元素大于当前元素直接覆盖,而到了最后当找到当

前元素的合适位置时只需要一次交换即可。

如序列:3 5 2 1 4

元素5先存入临时变量temp中,跟前面元素比较,比前面元素大,然后拿出下一个元素2存入临时变量temp中,2与前一个元素5比较,2比5小,用5直接覆盖2

结果序列为:3 5 5 1 4 temp=2,然后temp再与前一个元素3进行比较,发现2比3小,然后3再覆盖刚才的位置,序列为3 3 5 1 4这时发现已经到序列的头部了,

然后将temp=2复制给arr[0],就是直接覆盖第一个元素3,序列变为2 3 5 1 4,第一轮排序结束,跟直接插入排序太大的区别,只不过是减少了不断交换的次数

用直接复制覆盖取代,这样当数据量特别大时效率就会提高很多。

代码实现:

package Sort;

import java.util.Scanner;

public class InsertSort2 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner scan=new Scanner(System.in);
		int n=scan.nextInt();
		//输入
		int[] arr=new int[n];
		for(int i=0;i<n;i++) {
			arr[i]=scan.nextInt();
		}
		//排序
		for(int i=1;i<arr.length;i++) {//从第2个元素开始遍历
			int temp=arr[i];//将当前位置的元素取出
			int j;
			for(j=i;j>0;j--) {
				if(temp<arr[j-1]) {//如果这个元素比temp大就覆盖,否则就证明该元素之前已经有序就break
					arr[j]=arr[j-1];//直接用前一个元素进行覆盖
				}
				else {
					break;
				}
			}
			//将temp中的元素插入合适位置
			arr[j]=temp;
		}
		//输出
		for(int i=0;i<arr.length;i++) {
			//判断是否为最后一个元素
			if(i==arr.length-1) {
				System.out.print(arr[i]);  //最后一个元素,不用加空格
			}else {
				System.out.print(arr[i]+" ");
			}
			
		}
	}

}

  

posted @ 2018-02-02 14:31  henu小白  阅读(1666)  评论(0编辑  收藏  举报