Java算法实现-直接插入排序

来源:互联网 发布:淘宝签约商家 编辑:程序博客网 时间:2024/04/29 17:08

直接插入排序

定义:
有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法,
插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。插入算法把要排序的数组分成两部分:
第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素)。在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中。

插入排序的基本思想是:
每步将一个待排序的纪录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。 —–来自百度词条

当然了英文毫无压力的兄弟可以参考一下这里:
https://en.wikipedia.org/wiki/Insertion_sort

个人觉得首先不去考虑一个算法的时间复杂度与空间复杂度,单从应用场景上会让人更好理解

比如大家都有在学校课间操按身高(暂且默认升序)排成一列的经历,通常是后一个同学C与前一个同学B做比较,如果B的身高>C的身高,则前一个同学B的位置后移,否则保持位置不变; 之后C同学继续与前面的同学A的身高做比较,执行内部循环;

假设现在给定一个数组{171,163,178,184,172,168,190,175,161,160,185} 代表学生的身高

JAVA实现插入排序:

    public static int[] insertSort(int[] arrays) {        int back;                                 //标记位        for (int i = 1; i < arrays.length; i++) { //从第二个同学开始            back = arrays[i];                     //记录当前同学(的身高)            for (int j = i - 1; j >= 0; j--) {    //内部循环,依次与前一名同学做身高比较                if (arrays[j] > back) {           //如果前一名同学的身高大于当前同学的身高                    arrays[j + 1] = arrays[j];    //前一名同学后移一位                } else {                    break;                        //                }                arrays[j] = back;                 //后一名同学(也就是当前同学)移动至前一位            }        }        return arrays;    }
    public static void main(String[] args) {        int[] arrays ={171,163,178,184,172,168,190,175,161,160,185} ;        int[] insertSort = insertSort(arrays);        for (int i = 0; i < insertSort.length; i++) {            System.out.println(insertSort[i]);        }    }

打印结果:
160
161
163
168
171
172
175
178
184
185
190

再补充一个例子: 比如某个同学迟到进队

    public static int[] insertSort(int[] arrays, int x) {        int[] newArarrys = new int[arrays.length + 1];        newArarrys[newArarrys.length - 1] = x;        System.arraycopy(arrays, 0, newArarrys, 0, arrays.length);        int back;        for (int i = 1; i < newArarrys.length; i++) {            back = newArarrys[i];            for (int j = i - 1; j >= 0; j--) {                if (newArarrys[j] > back) {                    newArarrys[j + 1] = newArarrys[j];                } else {                    break;                }                newArarrys[j] = back;             }        }        return newArarrys;    }

运行:

public static void main(String[] args) {        int[] arrays ={171,163,178,184,172,168,190,175,161,160,185} ;        int[] insertSort = insertSort(arrays,170);        for (int i = 0; i < insertSort.length; i++) {            System.out.println(insertSort[i]);        }    }

打印结果:
160
161
163
168
170
171
172
175
178
184
185
190


最后在补个动图:

插入排序gif演示

原创粉丝点击