Java实现插入排序、希尔排序和归并排序详解与代码
本文详细介绍了如何使用Java实现常见的三种排序算法:插入排序、希尔排序和归并排序。文章提供了每种算法的算法步骤说明、动图演示以及完整的Java代码实现,帮助开发者理解其工作原理并应用于实际开发中。
插入排序
插入排序是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
第1步:初始化有序序列
将第一个元素视为有序序列,其余元素为待排序部分。
第2步:逐个插入并调整
从头到尾依次扫描未排序序列,将每个元素插入到已排序序列的正确位置(保持稳定性)。
动图演示
Java代码实现
public class InsertSort implements IArraySort {
@Override
public int[] sort(int[] sourceArray) throws Exception {
// 对arr进行拷贝,不改变参数内容
int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);
// 从下标为1的元素开始选择合适的位置插入
for (int i = 1; i < arr.length; i++) {
// 记录要插入的数据
int temp = arr[i];
// 从已经排序的序列最右边开始比较,找到比其小的数
int j = i;
while (j > 0 && temp < arr[j - 1]) {
arr[j] = arr[j - 1];
j--;
}
// 存在比其小的数,插入
if (j != i) {
arr[j] = temp;
}
}
return arr;
}
}
希尔排序
希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。但希尔排序是非稳定排序算法。
希尔排序的基本思想是:先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行依次直接插入排序。
第1步:动态设置初始间隔(gap)
选择一个增量序列 t1,t2,...,tk,其中 tk = 1。
第2步:按间隔分组进行插入排序
按增量序列个数 k,对序列进行 k 趟排序;每趟排序,根据对应的增量 ti,将待排序列分割成若干长度为 m 的子序列,分别对各子表进行直接插入排序。
Java代码实现
public class ShellSort implements IArraySort {
@Override
public int[] sort(int[] sourceArray) throws Exception {
int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);
int gap = 1;
// 动态计算初始间隔
while (gap < arr.length / 3) {
gap = gap * 3 + 1;
}
while (gap > 0) {
for (int i = gap; i < arr.length; i++) {
int tmp = arr[i];
int j = i - gap;
// 组内插入排序
while (j >= 0 && arr[j] > tmp) {
arr[j + gap] = arr[j];
j -= gap;
}
arr[j + gap] = tmp;
}
gap = (int) Math.floor(gap / 3);
}
return arr;
}
}
归并排序
归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
第1步:拆分序列至最小单位
递归地将数组从中间划分为两部分,直到每个子数组只有一个元素或为空。
第2步:合并有序子序列
使用双指针比较两个子序列的首元素,将较小的元素放入结果数组中,直到其中一个子序列遍历完毕,再将剩余元素追加到结果末尾。
动图演示
Java代码实现
public class MergeSort implements IArraySort {
@Override
public int[] sort(int[] sourceArray) throws Exception {
// 对 arr 进行拷贝,不改变参数内容
int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);
if (arr.length < 2) {
return arr;
}
int middle = (int) Math.floor(arr.length / 2);
int[] left = Arrays.copyOfRange(arr, 0, middle);
int[] right = Arrays.copyOfRange(arr, middle, arr.length);
return merge(sort(left), sort(right));
}
protected int[] merge(int[] left, int[] right) {
int[] result = new int[left.length + right.length];
int i = 0;
while (left.length > 0 && right.length > 0) {
if (left[0] <= right[0]) {
result[i++] = left[0];
left = Arrays.copyOfRange(left, 1, left.length);
} else {
result[i++] = right[0];
right = Arrays.copyOfRange(right, 1, right.length);
}
}
while (left.length > 0) {
result[i++] = left[0];
left = Arrays.copyOfRange(left, 1, left.length);
}
while (right.length > 0) {
result[i++] = right[0];
right = Arrays.copyOfRange(right, 1, right.length);
}
return result;
}
}免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









