Java俩种形式实现插入排序法

匿名 (未验证) 提交于 2019-12-02 21:53:52

排序的重要性使得大家总是走在寻找新方法的路上,冒泡排序->选择排序->插入排序三种方法见证了这一过程,这三种简单排序在实际应用中的使用率也是比较大的,当然也是我们学习高级排序的一个基础。

------------------------

什么是插入排序――

局部有序的群体中去。下面通过一个简图来说明一下:

黑色空心箭头由左向右遍历数组,每移动到一个位置便找到一个将要进行插入操作的元素(绿色椭圆,由于其所在位置后续会被覆盖,所以需将其值保存在临时变量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(); 	}  } 

运行结果:


效率总结――

在前一篇博客中已经对冒泡排序和选择排序进行了比较,这里把之前的比较图贴一下以便观察:


我们来看一下同样数据的插入排序的表现:


可以看出,当数据量较少时效率相差无几,但是一旦达到一个量级,插入排序效率的优势就很明显了。


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!