排序算法之直接插入排序

直接插入排序

Posted by DH on July 12, 2017

思想

插入排序的主要思想是,每次取待排序的数组中的第一个元素,去和已经排好序的数组进行比较,插入到合适的位置。 所以,插入排序将数组分为了两个部分,一个部分是已经排好序的,另一个部分是待排序数列。

举例

第一次,选择第一个元素作为已排序数组,然后将第二个元素与已排序的数组的第一个元素进行比较,确定位置。 接着,第三个元素与已排序的两个元素进行比较,确定位置。 因此,按照这种思想,总共要进行n-1次取待排序数组的第一个元素的操作。

再思考,取到了待排序的一个元素,怎么样去确定他在已排序数组中的位置呢?下面举例进行说明

例如要对 4 3 1 2 进行升序的插入排序操作,过程如下

此图片来自网络

代码

/// 插入排序
	public void insertSort(int [] input){
		
		for(int i =1; i < input.length; i++){
			int insertIndex = 0;
			// 找到插入位置
			while(insertIndex < i && input[insertIndex]<=input[i]){
					insertIndex++;
			}
			
			// 插入位置后的数整体后移
			if( insertIndex < i){
				int temp = input[i];
				while( i > insertIndex ){
					input[i] = input[i-1];
					i--;
				}
				input[insertIndex] = temp;
			}

		}
	}	

代码二:

package test;

import java.util.Arrays;

public class InsertSort {

	public static void main(String[] args) {

		InsertSort insertSort = new InsertSort();

		int [] a = {25 , 11,  45,  26,  12,  78};
		insertSort.insersort(a);
		
		System.out.println(Arrays.toString(a));
	}

	public void insersort(int [] a){
		
		if (a == null || a.length ==0) {
			return;
		}
		
		for(int i =1;i<a.length;i++){
			
			int j;
			int current = a[i];
			
			for(j = i-1;j>=0;j--){
				if (current < a[j]) {
					a[j + 1] = a[j];
				}else{
					break;
				}
			}
			
			a[j + 1] = current;
			
		}
		
	}
}
		

时间复杂度分析

很明显,外循环是n-1次。 当input[i]的值小于所有的已经排好序的数组元素的值的时候,内循环需要移动所有的input[0] – input[i-1]。 因此,第二个元素移动1次,第三个元素移动两次,第n个元素移动n-1次,这时,时间复杂度是1+2+3+。。。+n-1,时间复杂度是O(n2)。 而平均情况下,不需要一定i-1次,只需要移动(i-1)/2,时间复杂度也是O(n2)。

时间复杂度

O(1) 很明显