Java数据结构之常见排序算法(下)

Java数据结构之常见排序算法(下)

前言

这是 Java 数据结构之常见排序算法的第二篇,本篇文章将继续介绍常见的排序算法。对于尚未了解基本排序算法的读者,可以先阅读 Java 数据结构之常见排序算法(上)。

快速排序

快速排序是一种使用分治思想的排序算法,其思路是将一个数组分为两个子数组,再对子数组进行排序,这个过程不断递归执行。在具体实现时,选择一个元素作为基准值,将所有小于基准值的数放在基准值左侧,将所有大于等于基准值的数放在基准值右侧,然后分别以左右子数组为输入递归执行该过程。

快速排序的时间复杂度为 O(NlogN)(平均情况下),空间复杂度为 O(logN)。需要注意的是,如果选择基准值不合适,快排的时间复杂度可能会退化成 O(N^2),但这种情况比较少见,且可以通过随机化选择基准值来避免。

以下是使用 Java 实现的快排算法的示例代码:

public static void quickSort(int[] arr, int start, int end) {
    if (start >= end) {
        return;
    }
    // 选择基准值
    int pivot = arr[start];
    // 定义左右指针
    int left = start + 1, right = end;
    // 循环直到左右指针重合
    while (left <= right) {
        // 将左指针指向的数大于基准值的数换到右指针指向的位置
        while (left <= right && arr[left] < pivot) {
            left++;
        }
        // 将右指针指向的数小于等于基准值的数换到左指针指向的位置
        while (left <= right && arr[right] >= pivot) {
            right--;
        }
        if (left < right) {
            swap(arr, left, right);
        }
    }
    // 将基准值换到左指针指向的位置
    swap(arr, start, right);
    // 递归对左右子数组进行排序
    quickSort(arr, start, right - 1);
    quickSort(arr, right + 1, end);
}

public static void swap(int[] arr, int i, int j) {
    int tmp = arr[i];
    arr[i] = arr[j];
    arr[j] = tmp;
}

归并排序

归并排序是一种使用分治思想的排序算法,其思路是将一个数组分为两个子数组,分别对它们进行排序,然后将排序后的两个子数组合并成一个有序的数组。在具体实现时,可以使用递归算法,对于一个长度为 N 的数组,将其不断二分并递归执行归并排序,直到排序完整个数组。

归并排序的时间复杂度为 O(NlogN),空间复杂度为 O(N)。与快速排序不同,归并排序是一种稳定的排序算法。

以下是使用 Java 实现的归并排序算法的示例代码:

public static void mergeSort(int[] arr, int start, int end) {
    if (start >= end) {
        return;
    }
    int mid = (start + end) >> 1;
    // 递归对左右子数组进行排序
    mergeSort(arr, start, mid);
    mergeSort(arr, mid + 1, end);
    // 合并左右子数组
    int[] tmp = new int[end - start + 1];
    int i = start, j = mid + 1, k = 0;
    while (i <= mid && j <= end) {
        if (arr[i] <= arr[j]) {
            tmp[k++] = arr[i++];
        } else {
            tmp[k++] = arr[j++];
        }
    }
    while (i <= mid) {
        tmp[k++] = arr[i++];
    }
    while (j <= end) {
        tmp[k++] = arr[j++];
    }
    // 将合并后的数组复制回原数组
    for (int l = start, m = 0; l <= end; l++, m++) {
        arr[l] = tmp[m];
    }
}

总结

本篇文章介绍了常见的两种排序算法,快速排序和归并排序,它们分别具有不同的特点和适用场景。同时,本篇文章通过示例代码演示了这两种排序算法的具体实现方法,希望能帮助读者更好地理解和掌握它们。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java数据结构之常见排序算法(下) - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • 深入浅析C语言中堆栈和队列

    深入浅析C语言中堆栈和队列 堆栈(Stack) 堆栈是一种先进后出(Last In First Out,LIFO)的线性数据结构,只允许在一端进行插入和删除操作。堆栈在C语言中常用于函数调用时的参数传递、表达式求值和程序中断处理等场景。 实现堆栈的基本操作 下面是堆栈的基本操作,可以用数组来实现: 初始化 #define MAX_SIZE 100 // 假设…

    数据结构 2023年5月17日
    00
  • C++数据结构与算法之双缓存队列实现方法详解

    C++数据结构与算法之双缓存队列实现方法详解 引言 在实际开发中,双缓存队列是一个非常常见的数据结构,主要用来解决多线程情况下的数据同步问题。本篇文章将详细介绍如何使用C++语言实现双缓存队列。 双缓存队列简介 双缓存队列是一种常用的同步数据结构,它并非一个标准库中的容器,通常需要手动实现。双缓存队列维护着两个缓存区,一个当前使用的缓存区,一个需要被更新的缓…

    数据结构 2023年5月17日
    00
  • Halcon学习教程(一) 之提取十字线中心 图像分割

      原文作者:aircraft   原文链接:https://www.cnblogs.com/DOMLX/p/17266405.html      废话不多说,因为毕业后工作原因比较忙,好久没更新博客了,直接上图。。。     上图有个十字线,我们要提取出十字线的中心(Hhhh这个线是我随手画的 没画直!!) 第一步:肯定是读取图像进行灰度提取处理啦。   …

    算法与数据结构 2023年4月18日
    00
  • java 数据结构之堆排序(HeapSort)详解及实例

    Java 数据结构之堆排序(HeapSort)详解及实例 什么是堆排序 堆排序是一种树形选择排序,它的特点是不需要建立临时数组存放已排序的元素,而是直接在原数组上进行排序,因此空间复杂度比较小,时间复杂度为 $O(nlogn)$。 堆排序中需要用到的数据结构是堆,它是一种特殊的二叉树。堆分为大根堆和小根堆,大根堆满足任何一个非叶子节点的值都不小于其子节点的值…

    数据结构 2023年5月17日
    00
  • C语言数据结构之算法的时间复杂度

    关于C语言数据结构之算法的时间复杂度,需要先了解一些基本概念。 什么是时间复杂度 时间复杂度是算法的一种衡量标准,用于评估算法的执行效率。表示代码执行的时间和数据量之间的关系,通常用大O符号来表示,称为“大O记法”。 时间复杂度的分类 时间复杂度可分为以下几类: 常数阶:O(1) 对数阶:O(log n) 线性阶:O(n) 线性对数阶:O(n log n) …

    数据结构 2023年5月17日
    00
  • C#数据结构与算法揭秘二 线性结构

    C#数据结构与算法揭秘二 线性结构 线性结构是指数据元素之间一对一的关系,即数据元素之间存在一个前驱和一个后继。一般有两种基本形式:线性表和栈、队列。 线性表 线性表是由同类型数据元素构成有序序列的线性结构,常被用于实现基于数组的数据结构,如向量、矩阵等。 线性表可以分为顺序表和链表两种。 顺序表(Sequence List):是把线性表的元素按照顺序存储在…

    数据结构 2023年5月17日
    00
  • C语言数据结构顺序表中的增删改(尾插尾删)教程示例详解

    C语言数据结构顺序表中的增删改(尾插尾删)教程示例详解 什么是顺序表 顺序表是一种线性表,它通过一块连续的存储空间来存储数据。顺序表中的数据元素排列在物理存储空间上也是连续的,每个元素占用一个固定的位置和大小,并且使用下标来访问。 顺序表的定义 下面是以int类型为例的一个简单顺序表的定义: #define SIZE 50 typedef struct { …

    数据结构 2023年5月17日
    00
  • 数据结构 数组顺序存储详细介绍

    数据结构数组顺序存储详细介绍 什么是数组顺序存储? 数组是最基本的数据结构之一,在计算机程序中使用广泛。在数组中,存储的元素类型相同且占用相同的内存空间,可以通过下标进行快速访问和修改。数组可以使用不同的方法来存储在内存中,其中最简单的方法是数组顺序存储。 数组顺序存储是指将元素按照顺序依次存储在内存中的一块连续地址中,可以方便地进行随机访问。这种方式与链式…

    数据结构 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部