Java基础算法(2)——插入排序

Java基础算法(2)——插入排序

1.插入排序思路简述

遍历时每一元素插入前面已排序的序列中的合适位置(若为升序则大于前一元素小于后一元素)

以c s d n x i n g w e i 为例子,排序过程如下:

因为要插入元素,所以直接从第二个元素开始遍历:

以下为排序过程:

第一次插入s: s>c,s插入c后面: c s d n x i n g w e i
第二次插入d: d>c,与下一元素比较 d<s 插入c和s之间:c d s n x i n g w e i
第三次插入n: n>c,n>d,n<s,插入d和s之间:c d n s x i n g w e i
第四次差入x: x>c,x>d,x>n,x>s,插入s之后 :c d n s x i n g w e i
第五次差入i : i>c,i>d,i<n i插入d和n之间:c d i n s x n g w e i
第六次差入n: … c d i n n s x g w e i
第七次差入g: … c d g i n n s x w e i
第八次差入w: … c d g i n n s w x e i
第九次差入e: … c d e g i n n s w x i
第十次差入i: … c d e g i i n n s w x

当然以上比较大小是从前往后,是寻找比当前大的数值,也可是从后往前,从后往前就是寻找比当前小或等于的数值,下面代码实现是采用从后往前比较大小,若当前元素大于所遍历的元素则交换位置:

同样是上面例子:

分析最后一次插入过程:

第9次遍历结果 c d e g i n n s w x i

插入i

采用从后往前比较大小,寻找第一个比当前插入值小或等于的数值,并放在此数值之后。

i<x,比当前插入值大,所以i和x交换位置
c d e g i n n s w i x
i<w,比当前插入值大,所以i和w交换位置
c d e g i n n s i w x
i<s,比当前插入值大,所以i和s交换位置
c d e g i n n i s w x
i<n,比当前插入值大,所以i和n交换位置
c d e g i n i n s w x
i<n,比当前插入值大,所以i和n交换位置
c d e g i i n n s w x

i=i,是比当前插入值小或等于的数值,所以不用交换位置了,当前所在位置即使合理的插入位置

所以第10次遍历结果 c d e g i i n n s w x

2.完整代码实现(含注释)

与上一篇文章选择排序类似,继承排序类模板类Template

Java基础算法(1)——选择排序

package Algorithm.Sort;

/**
 * 插入排序
 * time:2019.08.20
 * author:lipiao
 */
public class InsertionSort extends Template {

    //升序
    public static void sort(Comparable[] a) {
        int N = a.length;
        System.out.println("排序过程:");

        //从下标为1开始遍历
        for (int i = 1; i < N; i++) {

            //遍历a[i]之前的元素 并插入到大于前一元素小于后一元素的位置
            //以此保证每次插入元素后下标为0到i的序列为升序
            for (int j=i;j>0&&less(a[j],a[j-1]);j--){
                exch(a,j,j-1);
            }
            //输出每次遍历后的结果
            show(a);

        }
    }

    public static void main(String[] args) {
        String[] a = {"c", "s", "d", "n", "x", "i", "n", "g", "w", "e", "i"};
        System.out.println("插入排序前");
        show(a);
        sort(a);
        assert isSorted(a);
        System.out.println("插入排序后");
        show(a);
    }
}


3.运行效果

[外链图片转存失败(img-F64YjeCt-1566309256630)(D:\markdowm笔记软件\images\java数据结构\插入排序.png)]
完整的排序过程分析:

插入排序前
c s d n x i n g w e i 
排序过程:
插入s
第1次遍历结果 c s d n x i n g w e i 
=============
插入d
d<s,所以d和s交换位置
c d s n x i n g w e i 
第2次遍历结果 c d s n x i n g w e i 
=============
插入n
n<s,所以n和s交换位置
c d n s x i n g w e i 
第3次遍历结果 c d n s x i n g w e i 
=============
插入x
第4次遍历结果 c d n s x i n g w e i 
=============
插入i
i<x,所以i和x交换位置
c d n s i x n g w e i 
i<s,所以i和s交换位置
c d n i s x n g w e i 
i<n,所以i和n交换位置
c d i n s x n g w e i 
第5次遍历结果 c d i n s x n g w e i 
=============
插入n
n<x,所以n和x交换位置
c d i n s n x g w e i 
n<s,所以n和s交换位置
c d i n n s x g w e i 
第6次遍历结果 c d i n n s x g w e i 
=============
插入g
g<x,所以g和x交换位置
c d i n n s g x w e i 
g<s,所以g和s交换位置
c d i n n g s x w e i 
g<n,所以g和n交换位置
c d i n g n s x w e i 
g<n,所以g和n交换位置
c d i g n n s x w e i 
g<i,所以g和i交换位置
c d g i n n s x w e i 
第7次遍历结果 c d g i n n s x w e i 
=============
插入w
w<x,所以w和x交换位置
c d g i n n s w x e i 
第8次遍历结果 c d g i n n s w x e i 
=============
插入e
e<x,所以e和x交换位置
c d g i n n s w e x i 
e<w,所以e和w交换位置
c d g i n n s e w x i 
e<s,所以e和s交换位置
c d g i n n e s w x i 
e<n,所以e和n交换位置
c d g i n e n s w x i 
e<n,所以e和n交换位置
c d g i e n n s w x i 
e<i,所以e和i交换位置
c d g e i n n s w x i 
e<g,所以e和g交换位置
c d e g i n n s w x i 
第9次遍历结果 c d e g i n n s w x i 
=============
插入i
i<x,所以i和x交换位置
c d e g i n n s w i x 
i<w,所以i和w交换位置
c d e g i n n s i w x 
i<s,所以i和s交换位置
c d e g i n n i s w x 
i<n,所以i和n交换位置
c d e g i n i n s w x 
i<n,所以i和n交换位置
c d e g i i n n s w x 
第10次遍历结果 c d e g i i n n s w x 
=============
插入排序后
c d e g i i n n s w x 

Process finished with exit code 0
发布了67 篇原创文章 · 获赞 32 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_42391904/article/details/99885188