java如何实插入排序算法

发布时间:2022-01-17 11:32:52 作者:小新
来源:亿速云 阅读:139
# Java如何实现插入排序算法

## 1. 插入排序算法概述

插入排序(Insertion Sort)是一种简单直观的排序算法,其基本思想是将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增1的有序表。插入排序适用于小规模数据或基本有序的数据集合。

### 1.1 算法特点
- **时间复杂度**:
  - 最优情况(已排序数组):O(n)
  - 最坏情况(逆序数组):O(n²)
  - 平均情况:O(n²)
- **空间复杂度**:O(1)(原地排序)
- **稳定性**:稳定排序算法

## 2. 插入排序工作原理

插入排序的工作方式类似于整理扑克牌:
1. 从第二个元素开始(假设第一个元素已排序)
2. 取出当前元素,与前面已排序的元素逐个比较
3. 找到合适位置后插入该元素
4. 重复上述过程直到数组完全排序

## 3. Java实现插入排序

### 3.1 基础实现

```java
public class InsertionSort {
    
    public static void insertionSort(int[] arr) {
        // 从第二个元素开始遍历
        for (int i = 1; i < arr.length; i++) {
            int key = arr[i]; // 当前需要插入的元素
            int j = i - 1;
            
            // 将比key大的元素向后移动
            while (j >= 0 && arr[j] > key) {
                arr[j + 1] = arr[j];
                j--;
            }
            arr[j + 1] = key; // 插入key到正确位置
        }
    }

    public static void main(String[] args) {
        int[] arr = {12, 11, 13, 5, 6};
        System.out.println("排序前: " + Arrays.toString(arr));
        
        insertionSort(arr);
        System.out.println("排序后: " + Arrays.toString(arr));
    }
}

3.2 优化版本(减少交换操作)

public static void optimizedInsertionSort(int[] arr) {
    for (int i = 1; i < arr.length; i++) {
        int key = arr[i];
        int j = i - 1;
        
        // 使用System.arraycopy优化元素移动
        while (j >= 0 && arr[j] > key) {
            j--;
        }
        if (j + 1 != i) {
            System.arraycopy(arr, j + 1, arr, j + 2, i - (j + 1));
            arr[j + 1] = key;
        }
    }
}

4. 算法分析

4.1 时间复杂度对比

情况 时间复杂度 说明
最优情况 O(n) 数组已经有序
最坏情况 O(n²) 数组完全逆序
平均情况 O(n²) 随机排列的数组

4.2 与其他排序算法比较

5. 实际应用场景

5.1 适用场景

5.2 不适用场景

6. 扩展实现

6.1 泛型版本实现

public static <T extends Comparable<T>> void genericInsertionSort(T[] arr) {
    for (int i = 1; i < arr.length; i++) {
        T key = arr[i];
        int j = i - 1;
        
        while (j >= 0 && arr[j].compareTo(key) > 0) {
            arr[j + 1] = arr[j];
            j--;
        }
        arr[j + 1] = key;
    }
}

6.2 递归实现

public static void recursiveInsertionSort(int[] arr, int n) {
    if (n <= 1) return;
    
    recursiveInsertionSort(arr, n - 1);
    
    int key = arr[n - 1];
    int j = n - 2;
    
    while (j >= 0 && arr[j] > key) {
        arr[j + 1] = arr[j];
        j--;
    }
    arr[j + 1] = key;
}

7. 性能测试

public static void main(String[] args) {
    // 测试10,000个随机数排序
    int[] largeArray = new Random().ints(10000).toArray();
    
    long start = System.nanoTime();
    insertionSort(largeArray);
    long end = System.nanoTime();
    
    System.out.printf("插入排序耗时: %.2f ms%n", (end - start) / 1_000_000.0);
}

8. 总结

插入排序虽然在大数据量上效率不高,但其简单直观的实现方式和在小数据量上的优秀表现,使其仍然具有重要价值。理解插入排序有助于掌握更复杂的排序算法,也是学习算法设计思想的良好起点。

关键点总结: 1. 插入排序是稳定的原地排序算法 2. 适合小规模或基本有序数据 3. Java实现仅需10行左右核心代码 4. 可以通过减少交换操作进行优化 “`

推荐阅读:
  1. 排序算法----插入排序
  2. 排序算法之插入排序

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java

上一篇:怎么使用Java实现二分查找

下一篇:如何进行Java中守护线程的分析及使用

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》