八大排序之插入排序

一、基本思想

    插入排序是一种简单直观的排序方法,基本思想是从待排记录中选择一个元素插入到已经有序的序列中。当待排记录中所有的元素都插入到有序序列中后,整个排序也就完成了。

二、实现方法

     大致思路:从无序序列中选取一个元素,在有序序列中找到合适的位置i,有序序列中i及其以后的元素后移,给待插元素让位。插入当前元素。

     详细操作:

    1.用一个数组a[]来模拟待排记录,数组长度为n。a[0]不存放待排元素,做监视哨。

    2.假设对a[i]进行插入排序,那么将整个数组从逻辑上划分成两部分,1 ~ (i-1)为有序序列,(i) ~ (n-1)为无序序列。

    3.默认a[1]在有序序列中,此时有序序列只有一个元素a[1],而无序序列为a[2] ~ a[n-1],所以进行第一次插入排序是从i = 2开始的。

    4.现插入a[i],做a[0] = a[i]。从有序序列的末尾开始查找刚好小于a[0]的元素的位置,于此同时在查找的过程中将那些大于a[0]的元素逐个后移,为新插入的元素腾出位置。

    5.对无序序列中的每一个元素进行上述插入排序,整个排序过程就完成了。

    

三、实现代码

    1.测试数组为1-100的随机整数数组。

    2.测试工具类 点击查看    

package sort;

import sort.util.*;


public class InsertSort implements ISort{

    public void sort(int[] a) {                          
        for(int i = 2; i < a.length; i++) {              //0号位置不存放排序的元素,1号位默认为已经排序号的元素,从2号开始插入
            a[0] = a[i];                                 //a[0]做哨兵和暂存空间
            int j;
            for(j = i - 1; a[0] < a[j]; j-- ){           //从有序序列的最后一位开始向前,找到合适的插入位置,a[0] < a[j]还可以进行越界的判断,有两个作用
                a[j+1] = a[j];                           //移动元素位置,给将插入的元素空位
            }
            a[j+1] = a[0];                               //已找到合适位置,插入元素
        }
    }
    
    public static void main(String[] args) {
        int[] array = RandomArrayGenerator.getRandomArray(100 , 30);
        SortTestHelper.test(new InsertSort() , array);
    }
}

    测试结果:(a[0]不计入待排记录,查看结果时忽略第一个元素)

    

四、算法分析

    时间复杂度:O(n2)

    空间复杂度:O(1)

    稳定性:稳定

    插入排序简单直观,占用空间少,但时间随n增长较快,所以适合元素较少的待排记录

     本文个人编写,水平有限,如有错误,恳请指出,欢迎讨论分享。

猜你喜欢

转载自www.cnblogs.com/wanghang-learning/p/9095700.html