排序的重要性使得大家总是走在寻找新方法的路上,冒泡排序->选择排序->插入排序三种方法见证了这一过程,这三种简单排序在实际应用中的使用率也是比较大的,当然也是我们学习高级排序的一个基础。
------------------------
什么是插入排序――
局部有序的群体中去。下面通过一个简图来说明一下:
黑色空心箭头由左向右遍历数组,每移动到一个位置便找到一个将要进行插入操作的元素(绿色椭圆,由于其所在位置后续会被覆盖,所以需将其值保存在临时变量temp中),通过与黑色空心箭头经过的元素进行比较,并将比此操作元素(绿色椭圆)大的元素依次向右侧移动,依次类推直到找到小于此操作元素(绿色椭圆)的位置,此时所有大于操作元素(绿色椭圆)的元素都已向后移动了一位并空出一个位置留给操作元素(绿色椭圆),最后只需将操作元素(绿色椭圆)插入到这个空位置即完成了一次插入排序(此操作过程的操作域为黑色虚线左侧部分,而这个操作域也变成了下一次操作的局部有序群体)。然后黑色空心箭头继续向右侧移动,且每移动一次就重复一遍上边的过程,直至遍历完所有元素即完成了所有数据的插入排序。
实现原理――
继续盗用《Java数据结构和算法》一书中的图。
但个人而言,本人在什么是插入排序中所叙述的更能体现插入排序的原理。
实现源码――
import java.util.Random; import java.util.Scanner; public class InsertSort{ //test the bubbleSort public static void main(String[] aegs){ Scanner sc=new Scanner(System.in); int[] array=null; //produce a array ArrayUtil util=new ArrayUtil(); System.out.println("Please set array`s size:"); int size=sc.nextInt(); array=util.produce(size); System.out.println("Before sort!"); util.show(array); Sort s=new Sort(array); long beginTime=util.getRuntime(); array=s.sortArray(); long endTime=util.getRuntime(); //show sorted array System.out.println("After sort!"); util.show(array); System.out.format("compairsion_times:%d--exchange_times:%d\n",s.getComparisiontimes(),s.getExchangetimes()); System.out.format("Runtime----%ds",(endTime-beginTime)); } } class Sort{ private int[] arr=null; private int EXCHANGE_TIMES=0; private int COMPIRASION_TIMES=0; public Sort(int[] array){ arr=array; } //insertSort public int[] sortArray(){ //this array is not empty if(arr!=null&&arr.length>0){ //形式二(通过思想演化出的另一种形式,个人觉得这样的书写形式更易理解,且经实测效率更高) int temp=0; for(int i=1;i<arr.length;i++){ temp=arr[i]; int sign=i;//记录操作元素将要插入的位置 for(int j=i-1;j>=0;j--){ if(temp<arr[j]){ arr[j+1]=arr[j]; sign=j; }else{ break; } } arr[sign]=temp; } //形式二(也是书中给出的编写形式) /* int out,in; for(out=0;out<arr.length;out++){ temp=arr[out]; in=out; while(in>0&&arr[in-1]>temp){ arr[in]=arr[in-1]; --in; } arr[in]=temp; } */ return arr; }else{ return null; } } //get exchange times public int getExchangetimes(){ return EXCHANGE_TIMES; } //get comparision times public int getComparisiontimes(){ return COMPIRASION_TIMES; } } //tool class class ArrayUtil{ private int[] arr=null; //make a array public int[] produce(int num){ Random rand=new Random(500); arr=new int[num]; for(int i=0;i<num;i++){ arr[i]=rand.nextInt(100); } return arr; } //show array public void show(int[] array){ if(array!=null){ for(int a:array){ if(a==array[array.length-1]){ System.out.format("%d\n",a); }else{ System.out.format("%d->",a); } } } } //get run time public long getRuntime(){ return System.currentTimeMillis(); } }
运行结果:
效率总结――
在前一篇博客中已经对冒泡排序和选择排序进行了比较,这里把之前的比较图贴一下以便观察:
我们来看一下同样数据的插入排序的表现:
可以看出,当数据量较少时效率相差无几,但是一旦达到一个量级,插入排序效率的优势就很明显了。
文章来源: Java俩种形式实现插入排序法