十大经典排序算法----3、插入排序

3、插入排序(Insertion Sort)

      插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

3.1 算法描述

一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下:

  • 从第一个元素开始,该元素可以认为已经被排序;
  • 取出下一个元素,在已经排序的元素序列中从后向前扫描;
  • 如果该元素(已排序)大于新元素,将该元素移到下一位置;
  • 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;
  • 将新元素插入到该位置后;
  • 重复步骤2~5。

3.2 动图演示

插入排序过程

3.3 代码实现

//Java实现插入排序
public class InsertSort {

	public int[] insertSort1(int[] ins){
		
		for(int i=1; i<ins.length; i++){
			for(int j=i; j>0; j--){
				if(ins[j]<ins[j-1]){
					int temp = ins[j-1];
					ins[j-1] = ins[j];
					ins[j] = temp;
				}
			}
		}
		return ins;
	}
	
	
	public int[] insertSort2(int[] ins){
		
		for(int i=1; i<ins.length; i++){
			int temp = ins[i];//保存每次需要插入的那个数
			int j;
			for(j=i; j>0&&ins[j-1]>temp; j--){//这个较上面有一定的优化
                            //把大于需要插入的数往后移动。最后不大于temp的数就空出来j
			    ins[j] = ins[j-1];
                                
			}
			ins[j] = temp;//将需要插入的数放入这个位置
		}
		return ins;
	}
}
//测试类
public class TestInsertSort {

	@Test
	public void testInsertSort() {
		InsertSort s = new InsertSort();
		int[] arr = {11,3,29,49,30,7,50,63,46,11,1};
		int[] arr1 = {1,3,5,7,9,11,13,14,46,11,3,29,49,30,7,50,63,46};
		System.out.println("原数组:"+Arrays.toString(arr));
		System.out.println("排序后的数组"+
                                    Arrays.toString(s.insertSort1(arr)));
		System.out.println("排序后的数组"+
                                     Arrays.toString(s.insertSort1(arr1)));            
	}

}

3.4 算法分析

      插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。

猜你喜欢

转载自blog.csdn.net/qq_34801169/article/details/81412054