在Java编程中,实现常见的排序算法是一项基础而重要的任务。排序算法是计算机科学中的经典问题之一,涉及将一组元素按照某个顺序进行排列。Java提供了一种非常灵活的编程环境,可以用来实现各种排序算法。
冒泡排序(Bubble Sort)
冒泡排序是一种简单的排序算法,它重复地遍历待排序数组,比较相邻的两个元素,如果它们的顺序不对,则交换它们。这个过程持续进行,直到整个数组都是有序的。
public class BubbleSort {public static void bubbleSort(int[] array) {int n = array.length;for (int i = 0; i < n - 1; i++) {for (int j = 0; j array[j + 1]) {// 交换array[j]和array[j+1]int temp = array[j];array[j] = array[j + 1];array[j + 1] = temp;}}}}public static void main(String[] args) {int[] array = {64, 34, 25, 12, 22, 11, 90};bubbleSort(array);System.out.println("Sorted array: " + Arrays.toString(array));}}
选择排序(Selection Sort)
选择排序是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找最小(或最大)元素,依次类推。
public class SelectionSort {public static void selectionSort(int[] array) {int n = array.length;for (int i = 0; i < n - 1; i++) {int minIndex = i;for (int j = i + 1; j < n; j++) {if (array[j] < array[minIndex]) {minIndex = j;}}// 交换array[i]和array[minIndex]int temp = array[i];array[i] = array[minIndex];array[minIndex] = temp;}}public static void main(String[] args) {int[] array = {64, 25, 12, 22, 11};selectionSort(array);System.out.println("Sorted array: " + Arrays.toString(array));}}
插入排序(Insertion Sort)
插入排序是一种简单直观的排序算法,它的工作原理是将一个元素插入到已排序好的数组中。插入排序从第一个元素开始,认为第一个元素是已排序的,然后将下一个元素插入到已排序的数组中,直到所有元素都被插入到合适的位置。
public class InsertionSort {public static void insertionSort(int[] array) {int n = array.length;for (int i = 1; i = 0 && array[j] > key) {array[j + 1] = array[j];j = j - 1;}// 将key插入到正确的位置array[j + 1] = key;}}public static void main(String[] args) {int[] array = {12, 11, 13, 5, 6};insertionSort(array);System.out.println("Sorted array: " + Arrays.toString(array));}}
归并排序(Merge Sort)
归并排序是一种分治算法,它将一个数组分成两个子数组,分别对子数组进行排序,然后合并这两个子数组以得到最终的有序数组。
import java.util.Arrays;public class MergeSort {public static void merge(int[] array, int left, int middle, int right) {int n1 = middle - left + 1;int n2 = right - middle;// 创建临时数组int[] leftArray = new int[n1];int[] rightArray = new int[n2];// 将数据复制到临时数组 leftArray[] 和 rightArray[]for (int i = 0; i < n1; ++i)leftArray[i] = array[left + i];for (int j = 0; j < n2; ++j)rightArray[j] = array[middle + 1 + j];// 归并临时数组到 array[left..right]int i = 0, j = 0;int k = left;while (i < n1 && j < n2) {if (leftArray[i] <= rightArray[j]) {array[k] = leftArray[i];i++;} else {array[k] = rightArray[j];j++;}k++;}// 复制剩余的元素while (i < n1) {array[k] = leftArray[i];i++;k++;}while (j < n2) {array[k] = rightArray[j];j++;k++;}}public static void mergeSort(int[] array, int left, int right) {if (left < right) {// 找出中间点int middle = left + (right - left) / 2;// 对左侧和右侧进行递归排序mergeSort(array, left, middle);mergeSort(array, middle + 1, right);// 合并已排序的子数组merge(array, left, middle, right);}}public static void main(String[] args) {int[] array = {12, 11, 13, 5, 6, 7};int n = array.length;System.out.println("Original array: " + Arrays.toString(array));mergeSort(array, 0, n - 1);System.out.println("Sorted array: " + Arrays.toString(array));}}
快速排序(Quick Sort)
快速排序是一种分治算法,它选择一个元素作为基准,将数组分成两个子数组,小于基准的放在左边,大于基准的放在右边,然后递归地对子数组进行排序。
import java.util.Arrays;public class QuickSort {public static int partition(int[] array, int low, int high) {int pivot = array[high];int i = low - 1;for (int j = low; j < high; j++) {if (array[j] <= pivot) {i++;// 交换 array[i] 和 array[j]int temp = array[i];array[i] = array[j];array[j] = temp;}}// 交换 array[i+1] 和 array[high]int temp = array[i + 1];array[i + 1] = array[high];array[high] = temp;return i + 1;}public static void quickSort(int[] array, int low, int high) {if (low < high) {// 获取分区点int partitionIndex = partition(array, low, high);// 对左右子数组进行递归排序quickSort(array, low, partitionIndex - 1);quickSort(array, partitionIndex + 1, high);}}public static void main(String[] args) {int[] array = {12, 11, 13, 5, 6, 7};int n = array.length;System.out.println("Original array: " + Arrays.toString(array));quickSort(array, 0, n - 1);System.out.println("Sorted array: " + Arrays.toString(array));}}
以上是几种常见的排序算法的Java实现。每种排序算法都有其特定的应用场景和性能特点。在实际应用中,根据数据规模和特点选择合适的排序算法是很重要的。这些排序算法的实现可以作为学习算法和数据结构的起点,理解它们的原理有助于提高编程技能和解决实际问题。