插入排序算法

Posted fefi521

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了插入排序算法相关的知识,希望对你有一定的参考价值。

插入排序

插入排序,也是一种基于位置比较交换的排序算法。在排序过程中,它总是维持着一个有序的子列表。例如,一个数组的较低索引部分维持着有序。排序的时候,新元素在之前有序的部分中找好位置"插入"进去。故名,插入排序。

数组被频繁的检索、为排序的项将会移动并插入到已排好序的子列表中,这些都是在一个数组中完成的。插入排序不适合数据量很大的数组排序,它的平均、最坏复杂度为O(N^2),N是数组的元素个数。

插入排序工作流程

我们以一个未排序的数组为例:

技术分享图片

插入排序首先会比较开始的两个元素:
技术分享图片

发现14和33已经是自然序的(上升排序)了。这时候14就是排好序的子列表:
技术分享图片

插入排序向前移动到第二个元素,比较33和27:
技术分享图片

发现33、2,7不是自然序的:
技术分享图片

交换33和27,同时会检查已经排好序的子列表中的所有元素,发现排好序的自列表中只有一个元素14,27大于14,交换后已经排序的子列表仍然保持是有序的:
技术分享图片

现在,有序列表为14,27,。接下来比较33、10:
技术分享图片

它们并不是有序的:
技术分享图片

因此,交换33和10:
技术分享图片

然而,交换之后,27、10是无序的了:
技术分享图片

因此,交换27和10:
技术分享图片

再次发现14、10不是有序的:
技术分享图片

继续交换它们。这样3趟之后,我们得到的有序子列表如下10,14,27:
技术分享图片

按这样的处理过程继续下去,直到所有的未排序的值均包含在一个有序的子表中。插入排序就完成了。

插入排序算法思路

按照上面的过程理一下编程思路:

  • Step 1 ?如果是第一个元素,则认为它是有序的。
  • Step 2 ? 获取下一个元素
  • Step 3 ? 和已经排序列表中的所有元素比较
  • Step 4 ? 移动有序列表中比当前待排序元素的值要大的所有元素
  • Step 5 ? 插入当前待排序元素
  • Step 6 ? 依次重复执行直到整个列表都是有序的

插入排序Java代码完整实现

最后编写Java代码实现插入排序:

package org.byron4j.sort;


/**
 * 
 * @author Byron.Y.Y
 * @version 1.0
 * Java-插入排序-以整形数组为例
 */
public class InsertionSort {
    
    
    public static void sort(int[] arr){
        //数组长度
        int size = arr.length;
        
        //待插入位置
        int holePosition = 0;
        
        //当前待插入的元素
        int valueToInsert = 0;
        
        
        /*外层循环控制选择排序的趟数*/
        for( int i = 1; i < size; i++ ){
            //当前待插入的元素
            valueToInsert = arr[i];
        
            holePosition = i;
            
            //当前待排序元素与前面已排好序的列表每个元素比较并移位
            while( holePosition > 0 && (arr[holePosition - 1] > arr[holePosition]) ){
                //将待插元素前面比它大的元素移往后移动一位(即放到当前待插元素最开始的位置上)
                arr[holePosition] = arr[holePosition - 1];
                //此时待插元素已经往前挪了一位了
                holePosition = holePosition - 1;
                //待插元素往前挪了一位
                arr[holePosition] = valueToInsert;
            }
            
            //至此第i+1趟,排序完毕,将第i+1小的元素放在第i+1的位置上
            //这里可以打印出来每一趟插入排序后数组的位置元素
            System.out.print("第" + ( i ) + "趟: ");
            for(int k = 0; k < size; k++){
                System.out.print(arr[k] + ((k != size -1) ? ", " : ""));
            }
            System.out.println();
        }
    }
    
    public static void main(String[] args) {
        int[] arr = {14, 33, 27, 10, 35, 19, 42, 44};
        sort(arr);
    }
}

运行结果:

1趟: 14, 33, 27, 10, 35, 19, 42, 442趟: 14, 27, 33, 10, 35, 19, 42, 443趟: 10, 14, 27, 33, 35, 19, 42, 444趟: 10, 14, 27, 33, 35, 19, 42, 445趟: 10, 14, 19, 27, 33, 35, 42, 446趟: 10, 14, 19, 27, 33, 35, 42, 447趟: 10, 14, 19, 27, 33, 35, 42, 44

以上是关于插入排序算法的主要内容,如果未能解决你的问题,请参考以下文章

排序算法之冒泡选择插入排序(Java)

排序算法之冒泡选择插入排序(Java)

《算法》笔记 3 - 选择排序插入排序希尔排序

插入排序算法详解及代码实现

算法漫游指北(第八篇)插入排序算法描述动图演示代码实现过程分析时间复杂度和希尔排序算法描述动图实现代码实现过程分析时间复杂度

算法漫游指北(第八篇)插入排序算法描述动图演示代码实现过程分析时间复杂度和希尔排序算法描述动图实现代码实现过程分析时间复杂度