直接插入排序

直接插入排序


title: 直接插入排序
tags: 数据结构与算法之美
author: 辰砂


1.排序过程

名词解释:整个排序过程为n-1趟插入,即先将序列中第1个记录看成是一个有序子序列,然后从第2个记录开始,逐个进行插入,直至整个序列有序

例(13,6,3,31,9,27,5,11)

13】, 6, 3, 31, 9, 27, 5, 11

6, 13】, 3, 31, 9, 27, 5, 11

3, 6, 13】, 31, 9, 27, 5, 11

3, 6, 13,31】, 9, 27, 5, 11

3, 6, 9, 13,31】, 27, 5, 11

3, 6, 9, 13,27, 31】, 5, 11

3, 5, 6, 9, 13,27, 31】, 11

3, 5, 6, 9, 11,13,27, 31

2.基本步骤

1.在R[1..i-1]中查找R[i]的插入位置,
R[1..j].key R[i].key< R[j+1..i-1].key;

2.将R[j+1..i-1]中的所有记录均后移一个位置;

3.将R[i] 插入到R[j+1]的位置上。

3.算法分析

假设对象个数为n,则执行n-1趟,比较次数和移动次数与初始排列有关

最好情况下:每趟只需比较 1 次,不移动 。总比较次数为 n-1

最坏情况下:第 i 趟比较i次,移动i+1次

若出现各种可能排列的概率相同,则可取最好情况和最坏情况的平均情况

平均情况比较次数和移动次数为n2/4
时间复杂度为 o(n2)
空间复杂度为 o(1)
是一种稳定的排序方法

4.完整代码示例

/**
 * @description: 插入排序
 *
 * 插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。
 * 它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
 *
 * 1 算法描述
 * 一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下:
 *
 * 从第一个元素开始,该元素可以认为已经被排序;
 * 取出下一个元素,在已经排序的元素序列中从后向前扫描;
 * 如果该元素(已排序)大于新元素,将该元素移到下一位置;
 * 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;
 * 将新元素插入到该位置后;
 * 重复步骤2~5。
 **/
public class InsertionSort {
    public static void main(String[] args) {

    }

    public static void insertionSort(int [] arr){
        int len = arr.length;
        int preIndex, current;
        for (int i = 1; i < len; i++) {
            preIndex = i - 1;
            current = arr[i];
            while (preIndex >= 0 && arr[preIndex] > current) {
                arr[preIndex + 1] = arr[preIndex];
                preIndex--;
            }
            arr[preIndex + 1] = current;
        }
    }
}
posted @ 2018-11-09 14:49 辰砂tj 阅读(...) 评论(...) 编辑 收藏