JAVA和Nginx 教程大全

网站首页 > 精选教程 正文

看动图学算法(三):插入排序算法原理和Java讲解

wys521 2024-11-17 02:52:03 精选教程 25 ℃ 0 评论

插入排序(Insertion Sort)是一种简单直观的排序方法,它的基本思想是将一个记录插入到已排好序的有序表中,从而得到一个新的、记录数增加1的有序表。

一、插入排序算法的原理

插入排序的实现过程是:将待排序数组的第一个元素视为已经有序的部分,从第二个元素开始依次插入到已经有序的部分中。

假设有一组无序序列 {53,37,48,11,15,24,63},将其使用插入排序算法进行排序。

首先,我们将序列的第一个元素 53 视为有序序列,从第二个元素 37 开始,按照以下步骤进行排序:

1、将当前元素 i 保存在临时变量 temp 中;

2、在已排序好的序列中,从右向左依次遍历,找到第一个比 i 大的元素,将其后移一位;

3、将 i 插入到空出来的位置中;

4、重复第 1 - 3 步,直至所有元素排序完成。

执行完第一轮排序后,得到的有序序列为 {37,53,48,11,15,24,63};执行完全部排序后,最终得到的排序结果为 {11,15,24,37,48,53,63}。

二、示例代码

以下是 Java 语言实现的插入排序算法的示例代码,附加了详细注释说明:

public class InsertionSort {

    public static void main(String[] args) {
        int[] arr = {4,30,24,11,23,37,48,15,24,33,2,33,11,15};
        insertionSort(arr);
        System.out.println(Arrays.toString(arr));
    }

    /**
     * 插入排序算法
     * @param arr 待排序数组
     */
    public static void insertionSort(int[] arr) {
        int len = arr.length;
        int temp; // 临时变量,用于存储当前元素
        int j; // 已排序部分的末尾索引
        for (int i = 1; i < len; i++) { // 第一个元素视为已排序部分,从第二个元素开始插入
            temp = arr[i]; // 存储待插入元素
            j = i - 1; // 已排序部分的末尾位置
            while (j >= 0 && temp < arr[j]) { // 如果 temp 小于已排序部分的某个元素,将其后移一位
                arr[j + 1] = arr[j];
                j--;
            }
            arr[j + 1] = temp; // 插入元素到空位上
        }
    }
}

insertionSort 方法为插入排序算法具体实现内容,其中:

1、首先,定义了一个临时变量 temp,用于存储当前元素;

2、每次将 temp 与已经有序的部分比较,从已排序部分的右边开始向左遍历,找到第一个比 temp 大的元素,将其后移一位;

3、最后,将 temp 插入到空出来的位置中。由于只涉及相邻元素之间的比较,因此插入排序是稳定的。

三、动图演示效果

四、插入排序算法的优化

虽然插入排序算法实现起来比较简单,但它的时间复杂度为 O(n^2),在处理大量数据时效率不高。因此,我们可以考虑对其进行优化,提高算法的执行效率。我们可以从以下几个方面进行优化:

1、二分插入排序

二分插入排序的基本思想是在已排序序列中采用二分查找法,寻找待插入元素在有序序列中的位置,然后将其插入到该位置上。与常规的插入排序算法相比,二分插入排序的关键代码改动仅体现在查找待插入位置上。使用二分查找法可以提高算法效率,二分查找法在已排序部分的长度变大时,插入操作所需的比较次数不会像线性查找那样增长,而是以对数级别增长,从而降低排序的时间复杂度。

2、希尔排序

希尔排序是插入排序的一种变体,它的基本思想是将整个待排序序列分割成若干个子序列分别进行插入排序,然后逐步缩小子序列长度,直至完成最后一次插入排序。后面的文章我们再详细讲解希尔排序的原理。

3、提前终止循环

在实现插入排序的过程中,如果当前元素插入到某一个位置之后,后面的元素已经有序,那么就可以提前终止循环,从而减少比较次数。

4、数组拷贝

在实现插入排序的过程中,可以将需要移动的元素拷贝到一个临时数组中,从而减少移动元素的次数。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表