Java常见排序算法之插入排序详解

一、简介

插入排序,就是假定一个参考值,假设该参考值左边的元素都有序,那么从该元素开始从后往前挨个查找,如果找到比参考值大的数,那么就将这个大的数后移,如果未找到比参考值大的数,说明不用移动元素。循环比较,这样经过比较后移之后就会空出下标为0的位置,用于存放这个参考值。

二、排序思路

排序思路:(假设从小到大)

【1】 待排序数组: 5, 6, 3, 7, 2, 1

【2】第一趟: 参考值指向第二个元素6, 假设6左面的元素 5 为有序的,从5开始,6和5比较,因为 6 > 5,没有找到比6大的数,因此不用右移,于是第一趟结果为: 5,6,3,7,2,1

【3】第二趟: 参考值指向第三个元素3, 经过第一趟排序3左边的元素 5,6 已经有序,从3开始从后往前挨个比较, 3 < 6,将6往后移,3 < 5,将5也往后移,这时候空出第一个位置用于填充参考值3,于是第二趟排序结果为: 3,5,6,7,2,1

【4】第三趟: 参考值指向第四个元素7, 经过第二趟排序后7左边的元素 3,5,6 已经有序,从7开始从后往前挨个比较, 7 > 6,7 > 5, 7 > 3,没有找到比7大的数,因此不用右移,于是第三趟结果为: 3,5,6,7,2,1

【5】第四趟: 参考值指向第五个元素2, 经过第三趟排序后2左边的元素 3,5,6,7 已经有序,从2开始从后往前挨个比较, 2 < 7,将7往后移, 2 < 6, 将6也往后移; 2 < 5,将5往后移;2 < 3 ,将3也往后移,这时空出第一个位置用于填充参考值2,于是第四趟结果为: 2,3,5,6,7,1

【6】第五趟: 参考值指向第六个元素1, 经过第三趟排序后1左边的元素 2,3,5,6,7 已经有序,从1开始从后往前挨个比较, 1 < 7,将7往后移,1 < 6,将6也往后移; 1 < 5,将5往后移;1 < 3 ,将3也往后移;1 < 2 ,将2也往后移,这时候空出第一个位置用于填充参考值1,于是第五趟结果为: 1,2,3,5,6,7

【7】元素已经有序,排序完毕。

三、算法实现

/**
 * @Description: 插入排序工具类
 * @Author: weishihuai
 * @Date: 2018/10/16 21:31
 * <p>
 * 原理:
 * 1、从第二个元素开始循环遍历,作为参考值,认定参考值左边的元素都有序。
 * 2、取出参考值的下一个元素,在已经排序的元素序列中从后向前扫描。
 * 3、如果该元素(已排序)大于新元素,则将该元素移到下一位置。
 * 4、重复步骤3,直到找到已排序的元素小于新元素的位置。
 * 5、将新元素插入到该位置。
 * 6、重复步骤2。
 */
public class InsertSortUtils {

    public static int[] sort(int[] array) {
        //从第二个元素开始遍历即可
        for (int i = 1; i < array.length; i++) {
            //参考值
            int temp = array[i];
            //从参考值前面一个元素开始从后往前查找
            int j = i - 1;
            for (; j >= 0; j--) {
                //假如找到比参考值大,数据往后移
                if (array[j] > temp) {
                    array[j + 1] = array[j];
                } else {
                    // 跳出循环
                    break;
                }
            }
            array[j + 1] = temp;
            System.out.println("第" + i + "趟排序后:" + Arrays.toString(array));
        }
        return array;
    }
}

测试:

public class Test {

    public static void main(String[] args) {
        int[] array = {5, 6, 3, 7, 2, 1};
        System.out.println("排序前: " + Arrays.toString(array));
        int[] arr = InsertSortUtils.sort(array);
        System.out.println("排序后: " + Arrays.toString(arr));
    }

}

测试结果:

四、原理分析

下图是对插入排序算法每一步排序的理解以及交换思路:

 

五、总结

本文是作者在复习插入排序算法的一些总结以及思路,仅供大家参考学习,一起学习一起进步。

1.算法是程序的灵魂,优秀的程序在对海量数据处理时,依然保持高速计算,就需要高效的数据结构和算法支撑。2.网上数据结构和算法的课程不少,但存在两个问题:1)授课方式单一,大多是照着代码念一遍,数据结构和算法本身就比较难理解,对基础好的学员来说,还好一点,对基础不好的学生来说,基本上就是听天书了2)说是讲数据结构和算法,但大多是挂羊头卖狗肉,算法讲的很少。 本课程针对上述问题,有针对性的进行了升级 3)授课方式采用图解+算法游戏的方式,让课程生动有趣好理解 4)系统全面的讲解了数据结构和算法, 除常用数据结构和算法外,还包括程序员常用10大算法:二分查找算法(非递归)、分治算法、动态规划算法、KMP算法、贪心算法、普里姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法、马踏棋盘算法。可以解决面试遇到的最短路径、最小生成树、最小连通图、动态规划等问题及衍生出的面试题,让你秒杀其他面试小伙伴3.如果你不想永远都是代码工人,就需要花时间来研究下数据结构和算法。教程内容:本教程是使用Java来讲解数据结构和算法,考虑到数据结构和算法较难,授课采用图解加算法游戏的方式。内容包括: 稀疏数组、单向队列、环形队列、单向链表、双向链表、环形链表、约瑟夫问题、栈、前缀、中缀、后缀表达式、中缀表达式转换为后缀表达式、递归与回溯、迷宫问题、八皇后问题、算法的时间复杂度、冒泡排序、选择排序、插入排序、快速排序、归并排序、希尔排序、基数排序(桶排序)、堆排序、排序速度分析、二分查找、插值查找、斐波那契查找、散列、哈希表、二叉树、二叉树与数组转换、二叉排序树(BST)、AVL树、线索二叉树、赫夫曼树、赫夫曼编码、多路查找树(B树B+树和B*树)、图、图的DFS算法和BFS、程序员常用10大算法、二分查找算法(非递归)、分治算法、动态规划算法、KMP算法、贪心算法、普里姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法马踏棋盘算法。学习目标:通过学习,学员能掌握主流数据结构和算法的实现机制,开阔编程思路,提高优化程序的能力。
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页
实付 19.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值