直接插入排序

Posted naloy

tags:

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

原理

直接插入排序:每一步将一个待排序的记录,插入到前面已经排好序的有序列中去,直到插完所有元素为止。

流程

已知数组【3,1,4,2,7,8,6,5】,(当前元素和他之前的元素进行比较)

第一次排序:从索引1位置开始,比较 3 和 1,3 > 1,3 和 1 交换,结果为【1,3,4,2,7,8,6,5】

第二次排序,从索引2位置开始,比较 3 和 4, 3 < 4,不需要调整,结果仍为【1,3,4,2,7,8,6,5】

第三次排序:从索引3位置开始,比较 4 和 2,4 > 2, 4 和 2 交换【1,3,2,4,7,8,6,5】,

                      继续比较 3 和 2,3 > 2,3 和 2 交换 【1,2,3,4,7,8,6,5】,

                      继续比较 1 和 2,1 < 2, 不需要调整,结果为【1,2,3,4,7,8,6,5】

第四次排序,从索引4位置开始,比较 4 和 7,4 < 7  不需要调整,结果为【1,2,3,4,7,8,6,5】

第五次排序,从索引5位置开始,比较 7 和 8,7 < 8  不需要调整,结果为【1,2,3,4,7,8,6,5】

第六次排序,从索引6位置开始,比较 8 和 6,8 > 6,8 和6 交换【1,2,3,4,7,6,8,5】,

                       继续比较 7 和 6,7 > 6,7 和 6 交换,【1,2,3,4,6,7,8,5】,

                       继续比较 4 和 6,4 < 6,不需要调整,结果为【1,2,3,4,6,7,8,5

第七次排序,从索引7位置开始,比较 8和 5,8 > 5, 8 和 5 交换【1,2,3,4,6,7,5,8】,

                      继续比较 7和 5, 7 > 5,7 和 5 交换【1,2,3,4,6,5,7,8】,

                      继续比较 6 和 5 ,6 > 5,6 和 5 交换【1,2,3,4,5,6,7,8】,

                      继续比较 4 和 5, 4 < 5 ,不需要调整,结果为【1,2,3,4,5,6,7,8】

排序结束。

复杂度

在最好的情况下,需要比较n-1 次,无序交换元素,时间复杂度为o(n), 在最坏的情况下,时间复杂度为o(n^2)

代码

package sequence;

import java.util.Arrays;

/**
 * 插入排序
 */
public class InsertionSort {
    public static void insertionSort(int[] arr){
        for(int i=1;i<arr.length;i++){
            for (int j = i; j >0 ; j--) {
                if(arr[j]<arr[j-1]){
                    swap(arr,j,j-1);
                }
            }
        }

        System.out.println(Arrays.toString(arr));
    }
    public static void swap(int[] arr,int i,int j){
        arr[i] = arr[i] ^ arr[j];
        arr[j] = arr[i] ^ arr[j];
        arr[i] = arr[i] ^ arr[j];
    }

    public static void main(String[] args) {
        insertionSort(new int[]{3,1,4,2,7,8,6,5});
    }
}

 

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

7种基本排序算法的Java实现

直接插入排序 ,折半插入排序 ,简单选择排序, 希尔排序 ,冒泡排序 ,快速排序 ,堆排序 ,归并排序的图示以及代码,十分清楚

排序算法学习(直接插入排序,希尔排序,选择排序,堆排序,冒泡排序)

直接插入折半插入希尔排序

直接插入折半插入希尔排序

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