前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基础算法系列之排序算法-3. 直接插入排序

基础算法系列之排序算法-3. 直接插入排序

作者头像
ACM算法日常
发布2018-10-18 11:12:57
7370
发布2018-10-18 11:12:57
举报
文章被收录于专栏:ACM算法日常ACM算法日常

我们之前已经学习了冒泡排序和二分查找两种基本算法,本篇文章我们将一起学习下一个基础算法——直接插入排序算法。


直接插入排序

直接插入排序,从这个名字来看,是不是让你想到了什么场景?!对了,就是打扑克牌的场景,我们每摸一张牌,是不是按照一定的次序插入到现有的牌当中,最后当摸完时,手上的牌就是按一定次序排列了。直接插入排序就是类似我们打扑克牌抓牌的过程。


直接插入排序的算法思想

直接插入排序跟冒泡排序一样,是一种最简单的排序算法,其基本操作就是讲一个数插入到已经排好序的序列中,从而得到一个新的,元素数+1的序列,直到插入完最后一个数,就完成了我们的排序工作。


直接插入排序的实现过程

我们将序列的第一个元素单独看成一个已知有序序列,逐次将每个数按顺序插入到这个序列中,通过n-1(假设有n个数)次循环,最后得到我们需要的有序序列。


代码实现

代码语言:javascript
复制
public static void straightInsertSort(int[] a) {
        int elements = 1; //记录结果集中元素的个数,起初只有a[0]这一个元素
        for(int i=1;i<a.length;i++){  //从a[1]开始逐个插入
            int j;
            for(j=0;j<elements;j++){  //遍历结果集,逐次与a[i]作比较
                if(a[j] > a[i]){  //若a[j] >a[i],则把结果集从最后位置(即a[elements-1])到j位置逐个向后移动一个位置
                    int temp = a[i]; //将要插入的值保留到temp中
                    for(int k =elements-1;k>=j;k--){
                        a[k+1] = a[k];
                    }
                    a[j] = temp;    //将要插入的值插入到j位置
                    elements++; //结果集元素的个数加1
                    break;
                }
            }
            if(j == elements){  //说明结果集中的元素都小于等于a[i],即将a[i]的值插入到末尾
                a[elements] = a[i];
                elements++;
            }

        }
    }

让我们运行下面的测试代码,来看看我们写的算法吧。

代码语言:javascript
复制
public static void main(String[] args) {
        int[] a = new int[]{5,3,9,7,6,18,1,16,15};
        straightInsertSort(a);
        for(int i =0;i<a.length;i++){
            System.out.print(a[i]+ "  ");
        }

    }

是不是与我们预期的一样呢~既然我们已经学习了直接插入排序算法,老规矩,来做个题练练手吧。


HDU 1106 排序

Problem Description

输入一行数字,如果我们把这行数字中的‘5’都看成空格,那么就得到一行用空格分割的若干非负整数(可能有些整数以‘0’开头,这些头部的‘0’应该被忽略掉,除非这个整数就是由若干个‘0’组成的,这时这个整数就是0)。 你的任务是:对这些分割得到的整数,依从小到大的顺序排序输出。

Input

输入包含多组测试用例,每组输入数据只有一行数字(数字之间没有空格),这行数字的长度不大于1000。 输入数据保证:分割得到的非负整数不会大于100000000;输入数据不可能全由‘5’组成。

Output

对于每个测试用例,输出分割得到的整数排序的结果,相邻的两个整数之间用一个空格分开,每组输出占一行。

Sample Input

代码语言:javascript
复制
0051231232050775

Sample Output

代码语言:javascript
复制
0 77 12312320

问题分析

我们可以将我们输入的这串序列保存在字符串中,然后通过字符串的split方法将'5'作为分隔符,将原序列分割为字符串数组,然后通过Integer.praseInt(String str)方法将数组中的每个字符串转化为整数,然后用我们今天学习的直接插入排序算法对这些整数进行排序就解决了。

代码

代码语言:javascript
复制
public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        String str = input.next(); //将我们输入的序列保存到字符串str中
        String[] strs = str.split("5"); //通过字符串的split方法将5作为分隔符分割原序列
        int[] result = new int[strs.length]; //定义数组result存储这些整数
        for(int i =0;i<result.length;i++){  //通过Integer.parseInt(String str)方法将字符串转为整数
            result[i] = Integer.parseInt(strs[i]);
        }
        straightInsertSort(result); //调用直接插入排序对数组result进行排序
        for(int i =0;i<result.length;i++) {  //打印结果
            System.out.print(result[i]+"  ");
        }


    }

    public static void straightInsertSort(int[] a) {
        int elements = 1; //记录结果集中元素的个数,起初只有a[0]这一个元素
        for(int i=1;i<a.length;i++){  //从a[1]开始逐个插入
            int j;
            for(j=0;j<elements;j++){  //遍历结果集,逐次与a[i]作比较
                if(a[j] > a[i]){   //若a[j] >a[i],则把结果集从最后位置(即a[elements-1])到j位置逐个向后移动一个位置
                    int temp = a[i]; //将要插入的值保留到temp中
                    for(int k =elements-1;k>=j;k--){
                        a[k+1] = a[k];
                    }
                    a[j] = temp;    //将要插入的值插入到j位置
                    elements++; //结果集元素的个数加1
                    break;
                }
            }
            if(j == elements){  //说明结果集中的元素都小于等于a[i],即将a[i]的值插入到末尾
                a[elements] = a[i];
                elements++;
            }

        }
    }

让我们测试一下吧。


总述

通过本次学习,我们又学会一种基础排序算法——直接插入排序算法,我们的算法水平又前进了一小步呢ヾ(◍°∇°◍)ノ゙

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-10-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 ACM算法日常 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档