插入排序的优化算法
插入排序会将之前的所有的比它大的元素进行两两交换(从小到大排列的排序),会增加一些交换时间,降低运行效率,下面我们来讨论一下它的优化算法,
不是进行两两交换,而是把当前待插入的元素取出,让当前元素与之前的所有元素进行一一比较,前一个元素大于当前元素直接覆盖,而到了最后当找到当
前元素的合适位置时只需要一次交换即可。
如序列: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]+" "); } } } }