插入排序Java代码实现

插入排序

插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。

算法描述

  1. 从第一个元素开始,该元素可以认为已经被排序;
  2. 取出下一个元素,在已经排序的元素序列中从后向前扫描;
  3. 如果该元素(已排序)大于新元素,将该元素移到下一位置;
  4. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;
  5. 将新元素插入到该位置后;
  6. 重复步骤2~5

算法分析

  • 时间复杂度
    • 平均情况:O(n2)
    • 最好情况 O(n)
    • 最坏情况 O(n2)
  • 空间复杂度: O(1)
  • 稳定性:稳定

代码实现

public class InsertionSort {
    public static void insertSort(int[] arr) {
        // 空数组 或 只有一个元素的数组,则什么都不做。
        if (arr == null || arr.length == 0) return;

        // 外层循环的 i 代表有序区的最后一个元素。
        for (int i = 0; i < arr.length - 1; i++) {
            // 待插入的元素暂存到value.
            int value = arr[i + 1];
            int j = i;
            // j < 0 时退出循环,说明 j 是最小的元素的索引值。
            // 或者 arr[j] <= value 时退出循环,说明 j 是比value小的元素的索引值。
            for (; j >= 0 && arr[j] > value; j--) {
                // 把元素往后挪。
                arr[j + 1] = arr[j];
            }
            // 把待插入元素,放到正确位置。
            arr[j + 1] = value;

            // 把每一趟排序的结果也输出一下。
            System.out.print("第 "+ (i+1) + " 趟: ");
            print(arr);
        }
    }

    public static void main(String[] args) {
        int[] arr = {6, 9, 1, 4, 5, 8, 7, 0, 2, 3};

        System.out.print("排序前:  ");
        print(arr);

        insertSort(arr);

        System.out.print("排序后:  ");
        print(arr);
    }

    // 打印数组
    public static void print(int[] arr) {
        if (arr == null)    return;

        for(int i : arr) {
            System.out.print(i + " ");
        }
        System.out.println();
    }
}
/*
排序前:  6 9 1 4 5 8 7 0 2 3 
第 1 趟: 6 9 1 4 5 8 7 0 2 3 
第 2 趟: 1 6 9 4 5 8 7 0 2 3 
第 3 趟: 1 4 6 9 5 8 7 0 2 3 
第 4 趟: 1 4 5 6 9 8 7 0 2 3 
第 5 趟: 1 4 5 6 8 9 7 0 2 3 
第 6 趟: 1 4 5 6 7 8 9 0 2 3 
第 7 趟: 0 1 4 5 6 7 8 9 2 3 
第 8 趟: 0 1 2 4 5 6 7 8 9 3 
第 9 趟: 0 1 2 3 4 5 6 7 8 9 
排序后:  0 1 2 3 4 5 6 7 8 9 
*/

 

你可能感兴趣的:(Java,学习)