Java排序实现详解:插入、快速与合并排序

版权申诉
0 下载量 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++; } } ``` 在这段代码中,通过递归的方式先将数组分成更小的数组,然后再将这些小数组按照顺序合并起来,从而得到最终的有序数组。 以上三种排序算法都是在实际应用中常用的排序方法,各有优缺点。插入排序简单直观,适用于小规模数据集;快速排序效率较高,适合处理大规模数据集,但在最坏情况下效率会降低;合并排序则在所有情况下都能保持较好的稳定性,但需要额外的空间。在不同的应用场景下选择合适的排序算法可以有效提升程序性能。