Java插入排序

1,171 阅读2分钟

Java的插入排序是属于比较常用的排序,插入排序与选择排序相比,插入排序在第二重循可以提前结束(满足一定条件即可),理论上效率要比选择排序高。

我们有必要学习插入排序吗?

插入排序是属于时间复杂度为O(N^2)在排序一些几乎有序的数组的时甚至会比时间复杂度为O(NlogN)更快。

下面来看一下我所写的插入排序算法

基本思想:把第二个数与前一个数做比较,小于前面的数就替换,以此类推。

插入排序一:

package SF;

public class InsertSort {

	private InsertSort() {
		
	}
	public static void sort(int [] arr) {
		
		int n =arr.length;
		for(int i=1;i<n;i++) {
			
		   for (int j=i;j>0&&arr[j]<arr[j-1];j--)	
			
			swap(arr,j);
			}
			
		
	}
	public static  void swap(int [] arr,int j) {
		int t =arr[j-1];
		arr[j-1]=arr[j];
		arr[j]=t;
	}	
	public static void main(String[] args) {
		int [] arr = {9,8,7,6,5,4,3,2,1,0};		
		InsertSort.sort(arr);	
		for (int i=0;i<arr.length;i++) {
			System.out.print(arr[i]);
			System.out.print(" ");
		}
		
	}
}

插入排序一用到元素的交换,元素的交换是非常耗费时间的,这里数据少可能看不出来,但数据多就可以比较明显的看出来,我们可以对此进行改进,下面来看一下插入排序二。

基本思想:先把第二个数复制出来,与前一个数做比较,小于的话就把第一个数赋给第二个数,然后先前复制的数赋给第一个,以此类推。

插入排序二


package SF;

public class InsertSort1 {
   
	private  InsertSort1() {
		
	}
	public static void sort( int [] arr) {	
		for(int i =1;i<arr.length;i++) {
			int a =arr[i];
			int j;
			for( j=i;j>0&&arr[j-1]>a;j--) {
				arr[j]=arr[j-1];
			}
			arr[j]=a;
		}
		
	}
	
	public static void main(String[] args) {
		int [] arr= {9,8,7,6,5,4,3,2,1};
		InsertSort1.sort(arr);
		for (int i = 0; i < arr.length; i++) {
			System.out.print(arr[i]);;
			System.out.print("");
		}
	}
}

总结

与插入排序一相比,改进后的插入排序二代码以赋值代替元素的交换swap可以大大增加排序的速度,其次,它的代码也更加简洁。