插入排序(Insertion Sort)

思路:

  • 将数组分为两个区域:已排序、未排序。
  • 初始已排序区域只第一个元素
  • 取未排序的区域的元素,在已排序的区域找到合适的位置插入
  • 保证已排序区域的数据一直有序
  • 重复这个过程,直到未排序区域为空


步骤:

  • 从数组第二个数开始,往后逐个取数,跟前面的数进行比较
  • 当所取的数,比前面的数大,停止比较,取一下个进行比较
  • 当所取的数,比前面的数小,把比所取数大的数都往后挪一个,直到所取数大于被比较的数停止,最后把所取数插入到比它小的数的右边


代码:

package constxiong.interview.algorithm;

/**
 * 插入排序
 * @author ConstXiong
 * @date 2020-04-08 09:35:40
 */
public class InsertionSort {

    public static void main(String[] args) {
        int [] array = {33, 22, 1, 4, 25, 88, 71, 4};
        insertionSort(array);
    }
    
    /**
     * 插入排序
     */
    private static void insertionSort(int[] array) {
        print(array);
        for (int i = 1; i < array.length; i++) {
            int j = i - 1;
            int value = array[i];
            for (; j >= 0; j--) {
                if (array[j] > value) {
                    array[j+1] = array[j];
                } else {
                    break;
                }
            }
            array[j+1] = value;
            print(array);
        }
    }
    
    /**
     * 打印数组
     * @param array
     */
    private static void print(int[] array) {
        for(int i : array) {
            System.out.print(i + " ");
        }
        System.out.println();
    }
    
}


打印:

33 22 1 4 25 88 71 4 
22 33 1 4 25 88 71 4 
1 22 33 4 25 88 71 4 
1 4 22 33 25 88 71 4 
1 4 22 25 33 88 71 4 
1 4 22 25 33 88 71 4 
1 4 22 25 33 71 88 4 
1 4 4 22 25 33 71 88 


特征:

  • 最好情况时间复杂度:O(n) 。即数组本身有序,如 1,2,3,4,5
  • 最坏情况时间复杂度:O(n2) 。即数组本身完全逆序,如 5,4,3,2,1
  • 平均时间复杂度:O(n2) 。在数组中插入一个数据的平均时间复杂度是 O(n),插入排序执行 n 次往数组中插入操作,所以平均时间复杂度是 O(n2)
  • 空间复杂度是 O(1)。是原地排序
  • 可以保持相等的值原有的前后顺序不变,是稳定排序

 

 

 


【Java面试题与答案】整理推荐

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值