排序算法Java实现

简介: 本文会通过Java语言实现:冒泡排序,插入排序,选择排序,归并排序,快速排序,桶排序,计数排序,基数排序,希尔排序 1.1 执行效率

本文会通过Java语言实现:冒泡排序,插入排序,选择排序,归并排序,快速排序,桶排序,计数排序,基数排序,希尔排序

1 分析排序算法

1.1 执行效率

  • 最好的情况,最坏的情况,平均情况时间复杂度
  • 时间复杂度的系数,常数,低阶
  • 比较次数和交换次数

1.2 算法的内存消耗

算法的内存消耗我们可以通过空间复杂度来度量。

原地排序算法,就是特指空间复杂度是O(1)的排序算法。

1.3 排序算法的稳定性

如果序列中有值相等的元素, 经过排序之后,相等元素之间原有的先后顺序不变化。

2 冒泡排序

稳定排序算法,原地排序算法,时间复杂度:O(n^2)

冒泡排序操作相邻的两个数据,每次冒泡操作都会对相邻的两个元素进行比较,看是否满足大小关系。每次冒泡都能选出最大的或者最小的值。

    /**
     * 冒泡排序
     * @param arr
     * @return
     */
    public static int[] bubbleSort(int[] arr) {
        if (arr == null || arr.length == 0) {
            return null;
        }
        int n = arr.length;
        // 总共需要循环n次  每次通过冒泡 得到最大的
        for (int i = 0; i < n; i++) {
            // 因为上一次已经确定了最大的,所以需要遍历的数据就是(n-1)-i
            boolean flag = true;
            for (int j = 0; j < (n - 1) - i ; j++) {
                if (arr[j] > arr[j + 1]) {
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                    flag = false;
                }
            }
            // 因为冒泡 如果这次冒泡没有数据没有交换所以数据已经有序了,可以提前退出
            if (flag) {
                break;
            }
        }
        return arr;
    }

3 插入排序

稳定排序算法,原地排序算法,时间复杂度O(n^2)

根据,把位置的元素,插入在有序的集合中,插入的时候根据元素位置大小。

首先:讲数组中的数据分为两个区间,已排序区间和未排序区间。初始已排序区间只有一个元素就是数组的第一个元素。

/**
     * 插入排序
     * @param arr
     * @return
     */
    public static int [] insertSort(int [] arr){
        if (arr==null||arr.length==0) {
            return null;
        }
        int n = arr.length;
        // n从一1开始表示a[0]属于有序序列
        for (int i = 1; i < n; i++) {
            // 当前需要比较的数字
            int value = arr[i];
            // 需要比较的次数
            int j = i-1;
            // 查找插入的位置
            for (; j>=0; j--) {
                if (arr[j]>value) {
                    // 数据移动
                    arr[j+1] = arr[j];
                }else {
                    // 插入排序前面是有序序列,所有不需要移动数据的时候,直接跳出比较下个数字
                    break;
                }
            }
            // 插入数据
            arr[j+1] = value;
        }
        return arr;
    }

4 选择排序

不是稳定排序算法,原地排序算法,时间复杂度是O(n^2)

每次会从未排序区间中找到最小元素,将其放到已排序区间的末尾

    /**
     * 选择排序
     * @param arr
     * @return
     */
    public static int [] selectionSort(int [] arr){
        if (arr==null||arr.length==0) {
            return null;
        }
        int n = arr.length;
        int temp = 0;
        int minKey = 0;
        // 刚开始没有有序区间,所以从0开始
        for (int i = 0; i < n; i++) {
            minKey = i;
            // 寻找无序区间最小的元素
            for (int j = i+1; j < n; j++) {
                if (arr[j]<arr[minKey]) {
                    minKey = j;
                }
            }
            // 交换位置   
            temp = arr[i];
            arr[i] = arr[minKey];
            arr[minKey] = temp;
        }
        return arr;
    }

未完,待续

目录
相关文章
|
1月前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
69 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
3月前
|
搜索推荐 算法 Java
手写快排:教你用Java写出高效排序算法!
快速排序(QuickSort)是经典的排序算法之一,基于分治思想,平均时间复杂度为O(n log n),广泛应用于各种场合。在这篇文章中,我们将手写一个Java版本的快速排序,从基础实现到优化策略,并逐步解析代码背后的逻辑。
145 1
|
1月前
|
算法 Java 数据中心
探讨面试常见问题雪花算法、时钟回拨问题,java中优雅的实现方式
【10月更文挑战第2天】在大数据量系统中,分布式ID生成是一个关键问题。为了保证在分布式环境下生成的ID唯一、有序且高效,业界提出了多种解决方案,其中雪花算法(Snowflake Algorithm)是一种广泛应用的分布式ID生成算法。本文将详细介绍雪花算法的原理、实现及其处理时钟回拨问题的方法,并提供Java代码示例。
67 2
|
3月前
|
算法 Java
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
51 6
|
3月前
|
搜索推荐 算法 Java
经典排序算法之-----选择排序(Java实现)
这篇文章通过Java代码示例详细解释了选择排序算法的实现过程,包括算法的基本思想、核心代码、辅助函数以及测试结果,展示了如何通过选择排序对数组进行升序排列。
经典排序算法之-----选择排序(Java实现)
|
3月前
|
搜索推荐 算法 Java
|
3月前
|
存储 算法 Java
LeetCode经典算法题:打家劫舍java详解
LeetCode经典算法题:打家劫舍java详解
68 2
|
3月前
|
人工智能 算法 Java
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
50 1
|
3月前
|
存储 算法 Java
LeetCode经典算法题:预测赢家+香槟塔java解法
LeetCode经典算法题:预测赢家+香槟塔java解法
59 1
|
3月前
|
数据采集 搜索推荐 算法
【高手进阶】Java排序算法:从零到精通——揭秘冒泡、快速、归并排序的原理与实战应用,让你的代码效率飙升!
【8月更文挑战第21天】Java排序算法是编程基础的重要部分,在算法设计与分析及实际开发中不可或缺。本文介绍内部排序算法,包括简单的冒泡排序及其逐步优化至高效的快速排序和稳定的归并排序,并提供了每种算法的Java实现示例。此外,还探讨了排序算法在电子商务、搜索引擎和数据分析等领域的广泛应用,帮助读者更好地理解和应用这些算法。
41 0