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) 稳定

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

相关推荐
地平线开发者1 小时前
J6B vio scenario sample
算法
BothSavage13 小时前
Trae远程开发中DeepSeek自定义模型4054错误的排查与修复
算法
小林ixn13 小时前
从暴力到KMP:一道题彻底搞懂字符串匹配的前世今生
算法
烬羽15 小时前
字符串算法入门:从反转字符串到回文判断,面试不再慌
算法·面试
先吃饱再说1 天前
判断回文字符串,从一行代码到双指针优化
算法
黄敬峰1 天前
深入理解算法核心:从递归思想、数组扁平化到快速排序
算法
得物技术1 天前
从狂野代码到按目标生产:得物推荐 AI Harness 的工程化实践|AICon 演讲整理
人工智能·算法·架构
AI小老六2 天前
SkillOpt 架构拆解:把 Skill 文本当参数,用执行轨迹训练 Agent
后端·算法·ai编程