在Java编程中,实现常见的排序算法是一项基础而重要的任务。排序算法是计算机科学中的经典问题之一,涉及将一组元素按照某个顺序进行排列。Java提供了一种非常灵活的编程环境,可以用来实现各种排序算法。
冒泡排序是一种简单的排序算法,它重复地遍历待排序数组,比较相邻的两个元素,如果它们的顺序不对,则交换它们。这个过程持续进行,直到整个数组都是有序的。
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 < n - i - 1; j++) {
if (array[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));
}
}
选择排序是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找最小(或最大)元素,依次类推。
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));
}
}
插入排序是一种简单直观的排序算法,它的工作原理是将一个元素插入到已排序好的数组中。插入排序从第一个元素开始,认为第一个元素是已排序的,然后将下一个元素插入到已排序的数组中,直到所有元素都被插入到合适的位置。
public class InsertionSort {
public static void insertionSort(int[] array) {
int n = array.length;
for (int i = 1; i < n; i++) {
int key = array[i];
int j = i - 1;
// 将array[0..i-1]中大于key的元素往后移动
while (j >= 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));
}
}
归并排序是一种分治算法,它将一个数组分成两个子数组,分别对子数组进行排序,然后合并这两个子数组以得到最终的有序数组。
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));
}
}
快速排序是一种分治算法,它选择一个元素作为基准,将数组分成两个子数组,小于基准的放在左边,大于基准的放在右边,然后递归地对子数组进行排序。
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实现。每种排序算法都有其特定的应用场景和性能特点。在实际应用中,根据数据规模和特点选择合适的排序算法是很重要的。这些排序算法的实现可以作为学习算法和数据结构的起点,理解它们的原理有助于提高编程技能和解决实际问题。