广告
返回顶部
首页 > 资讯 > 后端开发 > JAVA >六大排序算法(Java版):从插入排序到快速排序(含图解)
  • 333
分享到

六大排序算法(Java版):从插入排序到快速排序(含图解)

排序算法算法数据结构java后端 2023-09-15 21:09:06 333人浏览 薄情痞子
摘要

目录 插入排序 (Insertion Sort) 直接插入排序的特性总结: 选择排序 (Selection Sort) 直接选择排序的特性总结 冒泡排序 (Bubble Sort)  冒泡排序的特性总结 堆排序(Heap Sort) 堆排序

目录

插入排序 (Insertion Sort)

直接插入排序的特性总结:

选择排序 (Selection Sort)

直接选择排序的特性总结

冒泡排序 (Bubble Sort) 

冒泡排序的特性总结

堆排序(Heap Sort)

堆排序的特性总结

希尔排序 (Shell Sort) 

 希尔排序的特性总结

快速排序(Quick Sort)

Hoare版

 挖坑法

 前后指针

快速排序总结

总结


在计算机科学中,排序是一个基本的算法问题。排序算法可以将一组数据按照一定的顺序排列,这有助于提高搜索、查找和其他操作的效率。本文将介绍六种常见的排序算法,包括插入排序、希尔排序、选择排序、冒泡排序、堆排序和快速排序,每种算法都有其独特的特点和适用场景。

插入排序 (Insertion Sort)

插入排序是一种简单直观的排序算法,它逐步构建有序序列。它的工作原理是从未排序部分取出一个元素,将其插入到已排序部分的适当位置。插入排序的时间复杂度为O(n^2),适用于小型数据集。就像我们玩扑克牌一样~~😁

动画演示:

代码示例:

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;            while (j >= 0 && arr[j] > key) {                arr[j + 1] = arr[j];                j--;            }            arr[j + 1] = key;        }    }

插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。

直接插入排序的特性总结:

元素集合越接近有序,直接插入排序算法的时间效率越高

时间复杂度:O(N^2)

空间复杂度:O(1),它是一种稳定的排序算法

稳定性:稳定

选择排序 (Selection Sort)

选择排序一种简单但低效的排序算法。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。 

动画演示:

代码示例:

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^2)

空间复杂度:O(1)

稳定性:不稳定

冒泡排序 (Bubble Sort) 

冒泡排序是一种基本的交换排序算法,它重复遍历数据并比较相邻元素,如果它们的顺序不正确,则交换它们。冒泡排序的时间复杂度为O(n^2),与选择排序一样,适用于小型数据集。

动画演示:

代码示例: 

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]) {                    int temp = arr[j];                    arr[j] = arr[j + 1];                    arr[j + 1] = temp;                }            }        }    }

冒泡排序的特性总结

冒泡排序是一种非常容易理解的排序

时间复杂度:O(N^2)

空间复杂度:O(1)

稳定性:稳定

堆排序(Heap Sort)

堆排序使用二叉堆数据结构来实现排序。它将待排序数据构建成一个堆,然后逐步将堆顶元素与最后一个元素交换,然后对剩余部分重新构建堆。堆排序的时间复杂度为O(nlogn),性能较好,特别适用于大型数据集。

动画演示:

代码示例:

public class HeapSort {    public static void heapSort(int[] arr) {        int n = arr.length;        // 构建最大堆        for (int i = n / 2 - 1; i >= 0; i--) {            heapify(arr, n, i);        }        // 逐个将最大元素移到末尾        for (int i = n - 1; i > 0; i--) {            // 交换根节点(最大值)和当前未排序部分的末尾元素            int temp = arr[0];            arr[0] = arr[i];            arr[i] = temp;            // 对剩余部分重新构建最大堆            heapify(arr, i, 0);        }    }    public static void heapify(int[] arr, int n, int i) {        int largest = i;        int left = 2 * i + 1;        int right = 2 * i + 2;        // 找到左子节点和右子节点中的最大值        if (left < n && arr[left] > arr[largest]) {            largest = left;        }        if (right < n && arr[right] > arr[largest]) {            largest = right;        }        // 如果最大值不是根节点,则交换根节点和最大值,并继续堆化        if (largest != i) {            int swap = arr[i];            arr[i] = arr[largest];            arr[largest] = swap;            heapify(arr, n, largest);        }    }    public static void main(String[] args) {        int[] arr = {12, 11, 13, 5, 6, 7};        heapSort(arr);        System.out.println("堆排序结果:");        for (int num : arr) {            System.out.print(num + " ");        }    }}

堆排序的特性总结

堆排序使用堆来选数,效率就高了很多。

时间复杂度:O(N*logN)

空间复杂度:O(1)

稳定性:不稳定

希尔排序 (shell Sort) 

希尔排序法又称缩小增量法。希尔排序法的基本思想是:先选定一个整数,把待排序文件中所有记录分成多个组, 所有距离为的记录分在同一组内,并对每一组内的记录进行排序。然后,取,重复上述分组和排序的工作。当到达 =1时,所有记录在统一组内排好序。

动画演示:

代码示例:

public static void shellSort(int[] arr) {        int n = arr.length;        for (int gap = n / 2; gap > 0; gap /= 2) {            for (int i = gap; i < n; i++) {                int temp = arr[i];                int j = i;                while (j >= gap && arr[j - gap] > temp) {                    arr[j] = arr[j - gap];                    j -= gap;                }                arr[j] = temp;            }        }    }

 希尔排序的特性总结

希尔排序是对直接插入排序的优化

当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就会很快。这样整体而言,可以达到优化的效果。我们实现后可以进行性能测试的对比。

希尔排序的时间复杂度不好计算,因为gap的取值方法很多,导致很难去计算,因此在好些树中给出的希尔排序的时间复杂度都不固定:

快速排序(Quick Sort)

快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法,其基本思想为:任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中所有 元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止。

动画演示:

// 假设按照升序对array数组中[left, right)区间中的元素进行排序void QuickSort(int[] array, int left, int right){    if(right - left <= 1)        return;    // 按照基准值对array数组的 [left, right)区间中的元素进行划分    int div = partion(array, left, right);    // 划分成功后以div为边界形成了左右两部分 [left, div) 和 [div+1, right)    // 递归排[left, div)    QuickSort(array, left, div);    // 递归排[div+1, right)    QuickSort(array, div+1, right);}

上述为快速排序递归实现的主框架,发现与二叉树前序遍历规则非常像,我们在写递归框架时可想想二叉树前序遍历规则即可快速写出来,后序只需分析如何按照基准值来对区间中数据进行划分的方式即可。

Hoare版

private static int partition(int[] array, int left, int right) {    int i = left;    int j = right;    int pivot = array[left];    while (i < j) {        while (i < j && array[j] >= pivot) {            j--;        }    while (i < j && array[i] <= pivot) {            i++;        }    swap(array, i, j);    }    swap(array, i, left);    return i;}

 挖坑法

private static int partition(int[] array, int left, int right) {    int i = left;    int j = right;    int pivot = array[left];    while (i < j) {        while (i < j && array[j] >= pivot) {            j--;        }        array[i] = array[j];        while (i < j && array[i] <= pivot) {            i++;        }        array[j] = array[i];    }    array[i] = pivot;    return i;}

 前后指针

写法一: 

private static int partition(int[] array, int left, int right) {    int prev = left ;    int cur = left+1;    while (cur <= right) {        if(array[cur] < array[left] && array[++prev] != array[cur]) {        swap(array,cur,prev);        }        cur++;    }    swap(array,prev,left);    return prev;}

写法二:

private static int partition(int[] array, int left, int right) {    int d = left + 1;    int pivot = array[left];    for (int i = left + 1; i <= right; i++) {        if (array[i] < pivot) {            swap(array, i, d);            d++;        }    }    swap(array, d - 1, left);    return d - 1;}

快速排序总结

快速排序整体的综合性能和使用场景都是比较好的,所以才敢叫快速排序

时间复杂度:O(N*logN)

空间复杂度:O(logN)

稳定性:不稳定

 

总结

在这篇博客中,我们深入探讨了六种常见的排序算法,包括插入排序、希尔排序、选择排序、冒泡排序、堆排序和快速排序。以下是对每个排序算法的简要总结:

  1. 插入排序:逐步构建有序序列,适用于小型数据集,时间复杂度为O(n^2)。

  2. 希尔排序:改进的插入排序,通过分组排序提高效率,平均时间复杂度为O(nlogn)。

  3. 选择排序:每轮选择最小元素并放在已排序部分的末尾,适用于小型数据集,时间复杂度为O(n^2)。

  4. 冒泡排序:通过交换相邻元素将最大元素逐步移动到未排序部分的末尾,适用于小型数据集,时间复杂度为O(n^2)。

  5. 堆排序:使用堆数据结构实现排序,时间复杂度为O(nlogn),适用于大型数据集。

  6. 快速排序:分治排序算法,选择基准元素,将数据分为两个子数组,时间复杂度为O(nlogn),性能良好。

每个排序算法都有其独特的特点和适用场景,选择合适的算法取决于数据规模、性能需求和具体应用场景。这些排序算法的Java示例代码和详细解释有助于理解它们的工作原理和用法。 

总之,排序算法是计算机科学中的基础知识,了解这些算法对于编写高效的程序至关重要。

下一期我会总结一下快速排序的优化方法,希望大家支持~~🤩 

来源地址:https://blog.csdn.net/m0_62468521/article/details/132746451

--结束END--

本文标题: 六大排序算法(Java版):从插入排序到快速排序(含图解)

本文链接: https://www.lsjlt.com/news/409130.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 六大排序算法(Java版):从插入排序到快速排序(含图解)
    目录 插入排序 (Insertion Sort) 直接插入排序的特性总结: 选择排序 (Selection Sort) 直接选择排序的特性总结 冒泡排序 (Bubble Sort)  冒泡排序的特性总结 堆排序(Heap Sort) 堆排序...
    99+
    2023-09-15
    排序算法 算法 数据结构 java 后端
  • 排序算法图解之Java插入排序
    目录1.插入排序简介2.插入排序思想及图解3.插入排序代码实现1.插入排序简介 插入排序,一般也被称为直接插入排序。对于少量元素的排序,它是一个有效的算法。插入排序是一种最简单的排序...
    99+
    2022-11-13
    Java 插入排序算法 Java插入排序 Java 排序算法
  • JAVA十大排序算法之快速排序详解
    目录快速排序问题思路荷兰国旗问题代码实现时间复杂度算法稳定性总结快速排序 快速排序是对冒泡排序的一种改进,也是采用分治法的一个典型的应用。JDK中Arrays的sort()方法,具体...
    99+
    2022-11-12
  • 快速学习六大排序算法
    目录1. 插入排序2.希尔排序3.选择排序4.冒泡排序5.堆排序6.快速排序6.1 hoare版本(左右指针法)6.2 挖坑法6.3 前后指针法1. 插入排序 步骤: 1.从第一个元...
    99+
    2022-11-12
  • 快速掌握java排序算法-快速排序(图文)
    概念快速排序属于交换排序,主要步骤是使用基准元素进行比较,把小于基准元素的移动到一边,大于基准元素的移动到另一边。从而把数组分成两部分,然后再从这两部分中选取出基准元素,重复上面的步骤。过程如下:(推荐视频:java视频教程) 紫色:基准...
    99+
    2017-05-20
    java教程 快速排序 算法
  • JAVA十大排序算法之插入排序详解
    目录插入排序代码实现动图演示代码实现时间复杂度算法稳定性总结插入排序 当我们在玩扑克牌的时候,总是在牌堆里面抽取最顶部的一张然后按顺序在手中排列。 插入排序是指在待排序的元素中,假设...
    99+
    2022-11-12
  • Java 十大排序算法之插入排序刨析
    目录插入排序原理插入排序API设计插入排序代码实现插入排序的时间复杂度分析插入排序原理 ①把所有元素分成已排序和未排序两组 ②找到未排序组的第一个元素,向已经排序的组中进行插入 ③倒...
    99+
    2022-11-12
  • 排序算法图解之Java快速排序的分步刨析
    目录1.快速排序简介2.思路简介及图解3.实现代码及运行结果1.快速排序简介 快速排序是对冒泡排序的一种改进。基本思想为:通过一趟排序将要排序的数据分割为独立的两个部分,其中一部分的...
    99+
    2022-11-13
    Java快速排序算法 Java快速排序 Java 排序
  • 图解Java排序算法之快速排序的三数取中法
    目录基本步骤三数取中根据枢纽值进行分割代码实现总结基本步骤 三数取中 在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。在此我们采用三数取中法,也就是...
    99+
    2022-11-12
  • Python实现快速排序和插入排序算法及自定义排序的示例
    一、快速排序 快速排序(Quicksort)是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据...
    99+
    2022-06-04
    自定义 示例 算法
  • Java 七大排序之快速排序(三种方法包含优化方法)
    (1)基本思想 任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止。 (2)代码实现...
    99+
    2023-09-07
    java 排序算法 数据结构 算法
  • TypeScript十大排序算法插入排序实现示例详解
    目录一. 插入排序的定义二. 插入排序的流程三. 插入排序的图解四. 插入排序的代码五. 插入排序的时间复杂度六. 插入排序的总结一. 插入排序的定义 插入排序就像是你打扑克牌,你...
    99+
    2023-02-23
    TypeScript插入排序算法 TypeScript 算法
  • Java 选择排序、插入排序、希尔算法实例详解
           1、基本思想:在要排序的一组数中,选出最小的一个数与第一个位置的数交换;然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。...
    99+
    2023-05-31
    java 选择排序 插入排序
  • 详解Java双轴快速排序算法
    目录一、前言二、回顾单轴快排三、双轴快排分析3.1、总体情况分析3.2、k交换过程3.3、收尾工作四、双轴快排代码一、前言 首选,双轴快排也是一种快排的优化方案,在JDK的Array...
    99+
    2022-11-12
  • Java十大经典排序算法图解
    目录0、算法概述0.1算法分类0.2算法复杂度0.3相关概念1、冒泡排序(BubbleSort)1.1算法描述1.2动图演示1.3代码实现2、选择排序(SelectionSort)2...
    99+
    2022-11-12
  • 详解Python排序算法的实现(冒泡,选择,插入,快速)
    目录1. 前言2. 冒泡排序算法2.1 摆擂台法2.2 相邻两个数字相比较3. 选择排序算法4. 插入排序5. 快速排序6. 总结1. 前言 所谓排序,就是把一个数据群体按个体数据的...
    99+
    2022-11-10
  • 图解Java中插入排序算法的原理与实现
    目录一、基本思想二、算法分析1、算法描述2、过程分析三、算法实现一、基本思想 插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序...
    99+
    2022-11-13
  • 图解Java经典算法快速排序的原理与实现
    目录快速排序算法原理图解Java代码实现算法分析快速排序 通过一趟排序将待排元素分成独立的两部分,其中一部分为比基准数小的元素,另一部分则是比基准数大的元素。然后对这两部分元素再按照...
    99+
    2022-11-13
  • 图解Java经典算法插入排序的原理与实现
    目录一、算法介绍二、算法思想三、算法原理四、动图演示五、代码实现六、算法分析6.1 时间复杂度6.2 空间复杂度一、算法介绍 插入排序,也称为直接插入排序。插入排序是简单排序中效率最...
    99+
    2022-11-13
  • java数据结构与算法之快速排序详解
    本文实例讲述了java数据结构与算法之快速排序。分享给大家供大家参考,具体如下:交换类排序的另一个方法,即快速排序。快速排序:改变了冒泡排序中一次交换仅能消除一个逆序的局限性,是冒泡排序的一种改进;实现了一次交换可消除多个逆序。通过一趟排序...
    99+
    2023-05-31
    java 数据结构 算法
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作