插入排序是一种简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。以下是Java实现插入排序的代码示例:

 public class InsertionSort {
 
     // 主方法,用于测试插入排序
      public static void main(String[] args) {
          int[] array = {12, 11, 13, 5, 6};
          System.out.println("排序前的数组:");
          printArray(array);
          insertionSort(array);
          System.out.println("排序后的数组:");
          printArray(array);
     }
 
  
 
     // 插入排序算法实现
 
     public static void insertionSort(int[] array) {
 
         int n = array.length;
 
         for (int i = 1; i < n; ++i) {
 
             int key = array[i];
 
             int j = i - 1;
 
  
 
             // 将array[i]插入到已排序部分array[0..i-1]中
 
             while (j >= 0 && array[j] > key) {
 
                 array[j + 1] = array[j];
 
                 j = j - 1;
 
             }
 
             array[j + 1] = key;
 
         }
 
     }
 
  
 
     // 打印数组的方法
 
     public static void printArray(int[] array) {
 
         int n = array.length;
 
         for (int i = 0; i < n; ++i) {
 
             System.out.print(array[i] + " ");
 
         }
 
         System.out.println();
 
     }
 
 }

代码解释

  1. main方法
  • 创建一个示例数组 array
  • 打印排序前的数组。
  • 调用 insertionSort 方法对数组进行排序。
  • 打印排序后的数组。
  1. insertionSort方法
  • n 是数组的长度。
  • 外层 for 循环从 1 开始遍历数组,因为第 0 个元素默认是已排序的。
  • key 是当前要插入到已排序部分的元素。
  • 内层 while 循环将 key 与已排序部分的元素进行比较,如果已排序部分的元素大于 key,则将其向右移动一位。
  • 找到 key 的正确位置后,将其插入。
  1. printArray方法
  • 遍历数组并打印每个元素。

复杂度分析

  • 时间复杂度
  • 最好情况:O(n),当数组已经有序时。
  • 平均和最坏情况:O(n^2),在每次插入都需要移动大量元素时。
  • 空间复杂度:O(1),因为排序是在原地进行的,不需要额外的存储空间。

插入排序适用于小规模数据或基本有序的数据集,对于大规模或完全无序的数据集效率较低。