算法大神之路----排序(插入排序法)

插入排序法 所谓插入排序法乃是将一个数目插入该占据的位置.

输入一个元素,检查数组列表中的每个元素,将其插入到一个已经排好序的数列中的适当位置,使数列依然有序,当最后一个元素放入合适位置时,该数组排序完毕.

代码示例:

import java.util.Random;

/**
 * 算法大神之路----排序(插入排序法)
 */
public class Study03 {

    public static void main(String[] args) {

        //新建一个数组
        int[] arr = new int[6];
        Random r = new Random();
        for (int i = 0; i < arr.length; i++) {
        //使用随机数给数组赋值
            arr[i] = r.nextInt(50);
        }
        System.out.print("原数组为:");
        paint(arr);
        System.out.println("-----排序-----");

        //插入排序法,对数据进行排序
        for (int i = 0; i < arr.length; i++) {

            //从第二个数开始,取数,依次同它之前的数比较
            for (int j = 1; j <=i ; j++) {
                //选择插入位置
                if (arr[i] < arr[0]) {
                    //当比第一个数小的时候
                    int temp=arr[i];
                    for (int k = i; k >0; k--) {
                        arr[k]=arr[k-1];//循环遍历,向后移动一位
                    }
                    arr[0]=temp;
                    //当比第一个数小的时候,转换完毕后,直接跳过
                    continue;
                }
                //判断当不比第一个数小的情况下,在其他顺序数中,找到自己合适的位置
                if(arr[i]>arr[j-1]&&arr[i]<arr[j]){
                    //除了第一个数以外,找到比前一个数大,比后一个数小的时候,即找到插入点
                    int temp=arr[i];
                    for (int k = i; k >=j; k--) {
                        arr[k]=arr[k-1];//循环遍历,向后移动一位
                    }
                    arr[j]=temp;
                }
            }
            System.out.print("选取第"+(i+1)+"个数进行插入排序:");
            paint(arr);
        }
        System.out.println("---排序结束---");
        System.out.print("结果为:");
        paint(arr);

    }

    //将数组数据打印至控制台
    public static void paint(int[] arr){
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + "\t");
        }
        System.out.println();
    }
}

本示例是以数组为例,从数组第一个元素开始,依次与之前的数据进行比较,找到元素数据值比较,找到合适的位置作为插入点,然后将插入点往后的数据依次移一位,将当前数据插入到数组中,即可得到排序的效果.

控制台打印效果:

原数组为:47    48    38    45    32    12
-----排序-----
选取第1个数进行插入排序:47    48    38    45    32    12
选取第2个数进行插入排序:47    48    38    45    32    12
选取第3个数进行插入排序:38    47    48    45    32    12
选取第4个数进行插入排序:38    45    47    48    32    12
选取第5个数进行插入排序:32    38    45    47    48    12
选取第6个数进行插入排序:12    32    38    45    47    48
---排序结束---
结果为:12    32    38    45    47    48

因为数组是一个固定长度的存储"集合",对于改变位置,插入等操作相对于链表来说比较复杂,所以插入排序法更多的是使用在链表的集合之中.

时间: 2024-12-31 06:01:53

算法大神之路----排序(插入排序法)的相关文章

算法大神之路----排序(冒泡排序法)

冒泡排序法 冒泡排序法又称为交换排序法,是由观察水中冒泡变化构思而成,气泡随着水深压力而改变.气泡在水底时,水压最大,气泡最小,而气泡慢慢浮上水面时,气泡所受压力最小,体积慢慢变大. 冒泡排序比较方式是从第一个元素开始,比较相邻的元素大小,如果大小顺序有误,则对调后进行下一个元素比较.直到所有元素满足关系为止. 冒泡排序法分析 冒泡排序法平均情况下,需要比较(n-1)/2次,时间复杂度为O(n2),最好的情况只需要扫描一次,不用操作,即作n-1次比较,时间复杂度为O(n). 由于冒泡排序为相邻两

算法大神之路----排序(选择排序法)

选择排序法,顾名思义,就是把特定的数据选择出来进行排序. 选择排序法有两种方式 在所有的数据中,当由大到小排序,那么就将最大值放到第一个位置 如果由小到大排序,那么就将最小值放到第一个位置 以由小到大排序举例,当排序时候,扫描整个数据,拿第一个依次与其他做比较,如果其他数据比第一个大,或者相等,那么就不交换,如果其他数据比第一个数小,那么就交换二者的位置,扫描结束后,则从第二个数开始,依次扫描. 方法分析 无论是最坏还是最好情况,甚至是平均情况下,都需要对全部数据进行扫描,找到最大或最小值,因此

转发---十大编程算法助程序员走上大神之路

十大编程算法助程序员走上大神之路 本文为转发,源地址:http://linux.cn/article-3613-1.html 算法一:快速排序算法 快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序 n 个项目要Ο(n log n)次比较.在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见.事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来. 快速排序使用分治法(Divide and co

实例365(15)--------------经典排序----插入排序法

前言:此代码设计的比较简洁,可能不太容易理解,插入排序就是每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕. 一:截图 二:代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.

swoole通往大神之路——swoole任务中心说明及进程任务架构搭建

Swoole多任务处理中心 如果你还不会用swoole就out了,swoole通往大神之路——swoole任务中心说明及进程任务架构搭建 教学视频: www.bilibili.com/video/av779… 一.进程的基本知识 什么是进程,所谓进程其实就是操作系统中一个正在运行的程序,我们在一个终端当中,通过php,运行一个php文件,这个时候就相当于我们创建了一个进程,这个进程会在系统中驻存,申请属于它自己的内存空间系统资源并且运行相应的程序 对于一个进程来说,它的核心内容分为两个部分,一个

算法排序----插入排序法

接下来我来讲述一下插入排序法. 首先来解释一下插入排序法的原理,它的原理是每插入一个数都要将它和之前的已经完成排序的序列进行重新排序,也就是要找到新插入的数对应原序列中的位置.那么也就是说,每次插入一个数都要对原来排序好的那部分序列进行重新的排序,时间复杂度同样为O(n2). 这种算法是稳定的排序方法. 直接插入排序算法分析 根据代码我们来解释一下直接插入排序的核心 例如,我们要对5,3,4,6,2这几个数进行排序 a[] 0 1 2 3 4 值 5 3 4 6 2 当这个数组进入函数后,下标首

算法成神之路,请看这一篇!

随着自己写的越来越多,慢慢的就会有人和我主动交流,现在好多人希望我写一篇考研.就业的选择.零基础如何学习编程,秋招如何选择offer.等等 我以前写过一篇初入阿里---10 天,我自己还想写一篇在阿里的三个月,将中间的点点滴滴分享给大家,还想写一篇自己的思考.和打法战略,以及你们 99% 的人欠缺的一种能力,还有自己的技术路线的分享,目前是 C 之旅 要写的东西实在太多了,而我目前写公众号的时间,按一周时间计算,不能超过我睁眼时间的 1%,我 99% 的精力在其他地方,希望大家可以理解我,刚入职

对大数据量进行排序--位图法

题目:对2G的数据量进行排序,这是基本要求. 数据:1.每个数据不大于8亿:2.数据类型位int:3.每个数据最多重复一次. 内存:最多用200M的内存进行操作. 我听过很多种类似问题的解法,有的是内存多次利用,有的用到了外存,我觉得这两种做法都不是比较好的思想,太慢.由于这个题目看起来没有对效率进行约束,所以这两种方法也是对的,但是我这次提出一个比较好的算法来解答此题,如果有更好的做法请赶快跟帖留言,共同讨论.希望大神们的加入..... 思想:把200M的内存平分,可以开两个数组,一个数组ar

学会思考--菜鸟程序员晋升大神之路

"菜鸟"和"大神" 刚刚走出就业的程序员,技术是刚刚起步的基点.那下面我们就聊一聊有关技术的东西.首先请您先想想这几个问题.现在社会上有很多程序员,那您是否可想过程序 员为什么会有不同的水平?你又是哪一类的程序员?"菜鸟"程序员和"大神"程序员差在哪里?真是差在技术上了吗?那不是差在技术上那差在了哪里? 上面很多一连串的问题,没有把你搞晕吧!那就听我一一给您分析这个问题背后的答案.确切的说程序员分为"菜鸟"