插入排序的优化算法

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

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

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

如序列: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]+" ");
			}
			
		}
	}

}

  

转载于:https://www.cnblogs.com/henuLiGang/p/8405027.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值