什么是插入排序?
插入排序(Insertion Sort)是一种简单直观的排序算法,它的工作原理是逐步构建最终的排序序列。它的实现思路类似于人类按顺序排序一组扑克牌的方式。
插入排序的步骤:
开始:假设第一个元素已经被排序,因此从第二个元素开始。
比较和插入:依次将每个未排序的元素插入到已排序的部分中的正确位置。
-
将当前待排序元素与已排序部分的最后一个元素进行比较。
-
如果当前元素小于已排序元素,则将已排序元素向右移动一个位置,为当前元素腾出插入空间。
-
重复上述步骤,直到找到适当的插入位置。
重复:重复以上步骤,直到所有元素都被排序。
案例:
public class Insertion {
public static void insertionSort(int[] arr) {
// 使用插入排序算法对数组进行排序
for (int i = 1; i < arr.length; i++) {
// 将当前元素临时存储起来
int temp = arr[i];
// 从当前位置向前比较然后交换值
int j;
for (j = i; j > 0 && arr[j - 1] > temp; j--){
// 如果前一个元素大于当前参考值,则前移前一个元素
arr[j] = arr[j - 1];
}
// 插入当前临时变量到正确的位置
arr[j] = temp;
}
}
public static void main(String[] args) {
// 创建一个整数数组
int[] arr = {12, 11, 13, 5, 6};
// 调用插入排序方法
insertionSort(arr);
// 通过Arrays工具类的toString()方法打印输出
System.out.println(Arrays.toString(arr));
}
}
详细解释:
外层循环
for (int i = 1; i < arr.length; i++)
-
从
i = 1
开始遍历数组,直到i < arr.length
。我们从第二个元素开始(即索引1
),因为第一个元素在初始时已经被视为一个单独的排序区间,不需要处理。
保存当前元素
int temp = arr[i];
-
将当前元素
arr[i]
保存到temp
变量中,作为参考值。
内层循环 - 向前比较和移动元素
int j;
for (j = i; j > 0 && arr[j - 1] > temp; j--){
// 如果前一个元素大于当前参考值,则前移前一个元素
arr[j] = arr[j - 1];
}
-
j
从i
开始向前遍历,直到找到合适的位置或者到达数组的开始位置。 -
如果
arr[j - 1]
大于temp
,则将arr[j - 1]
移动到arr[j]
的位置。 -
这个过程持续进行,直到找到
temp
应插入的位置。
插入当前元素
arr[j] = temp;
-
将
temp
插入到找到的正确位置arr[j]
中。
算法流程
-
外层循环遍历每个未排序的元素。
-
内层循环将当前元素与已排序部分的元素进行比较。
-
内层循环移动比当前元素大的元素,以空出位置。
-
将当前元素插入到空出的位置。
小结:
插入排序是一种稳定的排序算法,即相同值的元素在排序后相对位置不变。适用于小型数据集或部分有序的数据。
欧了,到这里我应该解释的差不多啦,我是南极,大胆做自己,活出精彩的人生👊👊👊