赞
踩
插入排序是一种简单直观的排序算法,它的工作原理是将待排序的数组分为已排序和未排序两部分,逐步将未排序部分的元素插入到已排序部分中的正确位置,直到整个数组有序。
插入排序的详细步骤:
public class InsertionSort {
public static void main(String[] args) {
int[] arr = {7, 2, 1, 6, 8, 5, 3, 4};
insertionSort(arr);
System.out.println("Sorted array: " + Arrays.toString(arr));
}
public static void insertionSort(int[] arr) {
int n = arr.length;
for (int i = 1; i < n; i++) {
int key = arr[i]; // 当前要插入的元素
int j = i - 1; // 已排序部分的最后一个元素的索引
// 将已排序部分中比当前元素大的元素向后移动
while (j >= 0 && arr[j] > key) {
arr[j + 1] = arr[j];
j--;
}
// 插入当前元素到正确的位置
arr[j + 1] = key;
}
}
}
插入排序的时间复杂度为O(n^2),其中n是数组的长度。它是一种稳定的排序算法,并且在小规模数据或部分有序的数据上表现良好。然而,在处理大规模数据时,插入排序的性能可能不如其他更高效的排序算法。
优点:
缺点:
插入排序是一种简单但效率较低的排序算法,但可以通过一些优化策略来提高其性能。
在传统的插入排序中,为了找到当前元素的正确插入位置,需要逐个比较已排序部分中的元素。然而,我们可以使用二分查找的方法来减少比较的次数。具体步骤如下:
使用二分查找插入可以减少比较的次数,从而提高插入排序的性能。这种优化方法将插入排序的时间复杂度降低到 O ( n l o g n ) O(nlogn) O(nlogn)。
public class InsertionSort {
public static void main(String[] args) {
int[] arr = {7, 2, 1, 6, 8, 5, 3, 4};
insertionSort(arr);
System.out.println("Sorted array: " + Arrays.toString(arr));
}
public static void insertionSort(int[] arr) {
int n = arr.length;
for (int i = 1; i < n; i++) {
int key = arr[i]; // 当前要插入的元素
int j = binarySearch(arr, key, 0, i - 1); // 使用二分查找找到插入位置
// 将已排序部分中插入位置后的元素都向后移动
System.arraycopy(arr, j, arr, j + 1, i - j);
// 插入当前元素到正确的位置
arr[j] = key;
}
}
public static int binarySearch(int[] arr, int key, int start, int end) {
while (start <= end) {
int mid = start + (end - start) / 2;
if (arr[mid] == key) {
return mid;
} else if (arr[mid] < key) {
start = mid + 1;
} else {
end = mid - 1;
}
}
return start;
}
}
在传统的插入排序中,为了将当前元素插入到正确的位置,需要将较大的元素逐个向后移动,直到找到合适的位置。然而,我们可以通过将较大的元素向右移动一位,并将当前元素直接插入到正确位置来减少交换操作。具体步骤如下:
这种优化方法减少了交换操作的次数,从而提高了插入排序的性能。
public class InsertionSort {
public static void main(String[] args) {
int[] arr = {7, 2, 1, 6, 8, 5, 3, 4};
insertionSort(arr);
System.out.println("Sorted array: " + Arrays.toString(arr));
}
public static void insertionSort(int[] arr) {
int n = arr.length;
for (int i = 1; i < n; i++) {
int key = arr[i]; // 当前要插入的元素
int j = i - 1; // 已排序部分的最后一个元素的索引
// 将较大的元素向右移动一位
while (j >= 0 && arr[j] > key) {
arr[j + 1] = arr[j];
j--;
}
// 插入当前元素到正确的位置
arr[j + 1] = key;
}
}
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。