插入排序是一种简单直观的排序算法,它的基本思想是将一个元素逐步插入到已经排序好的部分,直至所有元素都被插入完成。以下是插入排序的实现步骤:
- 从第一个元素开始,该元素可以认为已经被排序。
- 取出下一个元素,在已经排序的元素序列中从后向前扫描。
- 如果该元素(已排序)大于新元素,将该元素移到下一位置。
- 重复步骤3,直到找到已排序的元素小于或等于新元素的位置。
- 将新元素插入到该位置后。 重复步骤2~5,直到整个序列排序完成。
Java代码实现如下,这里也提供了另外2种方法供大家参考:
java
public class InsertionSort {
public static void insertionSort(int[] arr) {
//默认索引0的元素已排序,从索引1开始
for (int low = 1; low < arr.length; low++) {
int temp = arr[low];
int i = low - 1;
// 自右向左找插入位置,如果比待插入元素大,则不断右移,空出插入位置
while (i >= 0 && temp < arr[i]) {
arr[i + 1] = arr[i];
i--;
}
// 找到插入位置, 此处不加判断也可
if (i != low - 1) {
arr[i + 1] = temp;
}
}
}
// 相比较第一种方法的缺点: 赋值次数较多
public static void insertionSort2(int[] arr) {
for (int low = 1; low < arr.length; low++) {
int i = low - 1;
while (i >= 0 && arr[i] > arr[i + 1]) {
//交换位置
int temp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = temp;
i--;
}
}
}
// 和上述两种相比,先找到已排序的区间
public static void insertionSort3(int[] arr) {
//1.找到第一个无序是从哪个索引开始的
int startIndex = -1;
for (int i = 0; i < arr.length; i++) {
if(arr[i] > arr[i + 1]){
startIndex = i + 1;
break;
}
}
//2.从无序的startIndex开始遍历
for (int i = startIndex; i < arr.length; i++) {
//记录当前要插入数据的索引
int j = i;
while(j > 0 && arr[j] < arr[j - 1]){
//交换位置
int temp = arr[j];
arr[j] = arr[j - 1];
arr[j - 1] = temp;
j--;
}
}
}
public static void main(String[] args) {
int[] arr1 = {8, 6, 7, 5, 3, 1, 2, 4};
System.out.println("原始数组: " + Arrays.toString(arr1));
// 调用插入排序方法
insertionSort(arr1);
System.out.println("排序后数组: " + Arrays.toString(arr1) + "\n");
int[] arr2 = {8, 6, 7, 5, 3, 1, 2, 4};
System.out.println("原始数组2: " + Arrays.toString(arr2));
// 调用插入排序方法2
insertionSort2(arr2);
System.out.println("排序后数组2: " + Arrays.toString(arr2) + "\n");
int[] arr3 = {8, 6, 7, 5, 3, 1, 2, 4};
System.out.println("原始数组3: " + Arrays.toString(arr3));
// 调用插入排序方法3
insertionSort3(arr3);
System.out.println("排序后数组3: " + Arrays.toString(arr3));
}
}