Java排序实现详解:插入、快速与合并排序
版权申诉
122 浏览量
更新于2024-12-06
收藏 18KB ZIP 举报
资源摘要信息:"Java实现排序的12种方式(2)"
在计算机科学中,排序算法是一种重要的算法类型,用于将一组元素按照特定的顺序重新排列。Java语言作为一种广泛使用的编程语言,提供了多种实现排序的方法。本资源详细介绍了Java中实现排序的12种方式,并且分为两部分进行讲解。在本部分(2)中,重点介绍了插入排序、快速排序以及合并排序这三种排序算法的实现。
四.插入排序及其实现
插入排序是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。
Java中的插入排序实现:
```java
public static void insertionSort(int[] arr) {
if (arr == null || arr.length < 2) {
return;
}
for (int i = 1; i < arr.length; i++) {
int current = arr[i];
int j = i - 1;
while (j >= 0 && arr[j] > current) {
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = current;
}
}
```
在这段代码中,通过一个外层循环遍历数组的每一个元素,然后通过一个内层循环将元素插入到已排序的数组中适当的位置。
五.快速排序及其实现
快速排序是由C. A. R. Hoare在1960年提出的一种分治算法。其基本思想是:选择一个基准元素,通过一趟排序将待排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
Java中的快速排序实现:
```java
public static void quickSort(int[] arr, int low, int high) {
if (low < high) {
int pivot = partition(arr, low, high);
quickSort(arr, low, pivot - 1);
quickSort(arr, pivot + 1, high);
}
}
private static int partition(int[] arr, int low, int high) {
int pivot = arr[low];
while (low < high) {
while (low < high && arr[high] >= pivot) {
high--;
}
arr[low] = arr[high];
while (low < high && arr[low] <= pivot) {
low++;
}
arr[high] = arr[low];
}
arr[low] = pivot;
return low;
}
```
在这段代码中,通过递归的方式实现快速排序,每次选择一个基准元素(pivot),并重新排列数组使得所有小于基准值的元素都位于其左侧,所有大于基准值的元素都位于其右侧。
六.合并排序及其实现
合并排序,又称归并排序,是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。合并排序将待排序的数组分成若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。
Java中的合并排序实现:
```java
public static void mergeSort(int[] arr, int left, int right) {
if (left < right) {
int mid = (left + right) / 2;
mergeSort(arr, left, mid);
mergeSort(arr, mid + 1, right);
merge(arr, left, mid, right);
}
}
private static void merge(int[] arr, int left, int mid, int right) {
int n1 = mid - left + 1;
int n2 = right - mid;
int[] L = new int[n1];
int[] R = new int[n2];
System.arraycopy(arr, left, L, 0, n1);
System.arraycopy(arr, mid + 1, R, 0, n2);
int i = 0, j = 0;
int k = left;
while (i < n1 && j < n2) {
if (L[i] <= R[j]) {
arr[k] = L[i];
i++;
} else {
arr[k] = R[j];
j++;
}
k++;
}
while (i < n1) {
arr[k] = L[i];
i++;
k++;
}
while (j < n2) {
arr[k] = R[j];
j++;
k++;
}
}
```
在这段代码中,通过递归的方式先将数组分成更小的数组,然后再将这些小数组按照顺序合并起来,从而得到最终的有序数组。
以上三种排序算法都是在实际应用中常用的排序方法,各有优缺点。插入排序简单直观,适用于小规模数据集;快速排序效率较高,适合处理大规模数据集,但在最坏情况下效率会降低;合并排序则在所有情况下都能保持较好的稳定性,但需要额外的空间。在不同的应用场景下选择合适的排序算法可以有效提升程序性能。
2024-07-04 上传
2022-09-22 上传
2022-09-20 上传
2022-09-24 上传
2022-09-24 上传
2021-08-09 上传
2021-08-11 上传
2021-08-09 上传
2022-09-14 上传