Java五大排序算法详解与实现

在Java中,常用的五大排序算法包括:冒泡排序选择排序插入排序快速排序归并排序。下面我将为你详细介绍每种算法的原理、Java实现代码以及它们的优缺点。

1. 冒泡排序 (Bubble Sort)

原理

通过重复遍历要排序的列表,比较相邻元素并交换位置,直到列表完全有序。

Java实现

java 复制代码
public class BubbleSort {
    public static void bubbleSort(int[] arr) {
        int n = arr.length;
        for (int i = 0; i < n - 1; i++) {
            for (int j = 0; j < n - i - 1; j++) {
                if (arr[j] > arr[j + 1]) {
                    // 交换 arr[j] 和 arr[j+1]
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }
    }
}

特点

  • 时间复杂度:O(n²)

  • 空间复杂度:O(1)

  • 稳定性:稳定

2. 选择排序 (Selection Sort)

原理

每次从未排序部分选择最小(或最大)元素,放到已排序部分的末尾。

Java实现

java 复制代码
public class SelectionSort {
    public static void selectionSort(int[] arr) {
        int n = arr.length;
        for (int i = 0; i < n - 1; i++) {
            int minIndex = i;
            for (int j = i + 1; j < n; j++) {
                if (arr[j] < arr[minIndex]) {
                    minIndex = j;
                }
            }
            // 交换找到的最小值和当前位置
            int temp = arr[minIndex];
            arr[minIndex] = arr[i];
            arr[i] = temp;
        }
    }
}

特点

  • 时间复杂度:O(n²)

  • 空间复杂度:O(1)

  • 稳定性:不稳定

3. 插入排序 (Insertion Sort)

原理

将未排序元素逐个插入到已排序部分的正确位置。

Java实现

java 复制代码
public class InsertionSort {
    public static void insertionSort(int[] arr) {
        int n = arr.length;
        for (int i = 1; i < n; i++) {
            int key = arr[i];
            int j = i - 1;
            
            // 将比key大的元素向右移动
            while (j >= 0 && arr[j] > key) {
                arr[j + 1] = arr[j];
                j--;
            }
            arr[j + 1] = key;
        }
    }
}

特点

  • 时间复杂度:O(n²)

  • 空间复杂度:O(1)

  • 稳定性:稳定

4. 快速排序 (Quick Sort)

原理

采用分治策略,选择一个基准元素,将数组分为两部分,使得左边都小于基准,右边都大于基准,然后递归排序。

Java实现

java 复制代码
public class QuickSort {
    public static void quickSort(int[] arr, int low, int high) {
        if (low < high) {
            int pi = partition(arr, low, high);
            quickSort(arr, low, pi - 1);
            quickSort(arr, pi + 1, high);
        }
    }
    
    private static int partition(int[] arr, int low, int high) {
        int pivot = arr[high];
        int i = low - 1;
        
        for (int j = low; j < high; j++) {
            if (arr[j] < pivot) {
                i++;
                // 交换arr[i]和arr[j]
                int temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
        }
        
        // 交换arr[i+1]和arr[high](基准)
        int temp = arr[i + 1];
        arr[i + 1] = arr[high];
        arr[high] = temp;
        
        return i + 1;
    }
}

特点

  • 时间复杂度:平均O(n log n),最坏O(n²)

  • 空间复杂度:O(log n)

  • 稳定性:不稳定

5. 归并排序 (Merge Sort)

原理

采用分治策略,将数组递归分成两半,分别排序后合并。

Java实现

java 复制代码
public class MergeSort {
    public static void mergeSort(int[] arr, int left, int right) {
        if (left < right) {
            int mid = left + (right - left) / 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[] leftArr = new int[n1];
        int[] rightArr = new int[n2];
        
        // 复制数据到临时数组
        for (int i = 0; i < n1; i++) {
            leftArr[i] = arr[left + i];
        }
        for (int j = 0; j < n2; j++) {
            rightArr[j] = arr[mid + 1 + j];
        }
        
        // 合并临时数组
        int i = 0, j = 0, k = left;
        while (i < n1 && j < n2) {
            if (leftArr[i] <= rightArr[j]) {
                arr[k] = leftArr[i];
                i++;
            } else {
                arr[k] = rightArr[j];
                j++;
            }
            k++;
        }
        
        // 复制剩余元素
        while (i < n1) {
            arr[k] = leftArr[i];
            i++;
            k++;
        }
        while (j < n2) {
            arr[k] = rightArr[j];
            j++;
            k++;
        }
    }
}

特点

  • 时间复杂度:O(n log n)

  • 空间复杂度:O(n)

  • 稳定性:稳定

测试示例

java 复制代码
public class SortTest {
    public static void main(String[] args) {
        int[] arr = {64, 34, 25, 12, 22, 11, 90};
        
        System.out.println("原始数组: " + Arrays.toString(arr));
        
        // 选择其中一种排序方法测试
        // BubbleSort.bubbleSort(arr);
        // SelectionSort.selectionSort(arr);
        // InsertionSort.insertionSort(arr);
        // QuickSort.quickSort(arr, 0, arr.length - 1);
        MergeSort.mergeSort(arr, 0, arr.length - 1);
        
        System.out.println("排序后数组: " + Arrays.toString(arr));
    }
}

总结比较

排序算法 平均时间复杂度 最好情况 最坏情况 空间复杂度 稳定性
冒泡排序 O(n²) O(n) O(n²) O(1) 稳定
选择排序 O(n²) O(n²) O(n²) O(1) 不稳定
插入排序 O(n²) O(n) O(n²) O(1) 稳定
快速排序 O(n log n) O(n log n) O(n²) O(log n) 不稳定
归并排序 O(n log n) O(n log n) O(n log n) O(n) 稳定

这些排序算法各有适用场景,在实际开发中需要根据数据规模、数据特征和性能要求来选择合适的算法。

相关推荐
晨晖215 小时前
顺序查找:c语言
c语言·开发语言·算法
LYFlied16 小时前
【每日算法】LeetCode 64. 最小路径和(多维动态规划)
数据结构·算法·leetcode·动态规划
Salt_072816 小时前
DAY44 简单 CNN
python·深度学习·神经网络·算法·机器学习·计算机视觉·cnn
货拉拉技术16 小时前
AI拍货选车,开启拉货新体验
算法
MobotStone16 小时前
一夜蒸发1000亿美元后,Google用什么夺回AI王座
算法
Wang2012201316 小时前
RNN和LSTM对比
人工智能·算法·架构
xueyongfu17 小时前
从Diffusion到VLA pi0(π0)
人工智能·算法·stable diffusion
永远睡不够的入17 小时前
快排(非递归)和归并的实现
数据结构·算法·深度优先
cheems952717 小时前
二叉树深搜算法练习(一)
数据结构·算法
sin_hielo17 小时前
leetcode 3074
数据结构·算法·leetcode