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
  • TypeScript 基础数据结构哈希表 HashTable教程

    TypeScript 基础数据结构哈希表 HashTable 教程 什么是哈希表 HashTable 在计算机科学中,哈希表(HashTable),也叫散列表,是根据关键码值(Key­value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫作哈希函数,存放记录的数组叫作哈希表。 如何实现哈…

    数据结构 2023年5月17日
    00
  • 「学习笔记」AC 自动机

    「学习笔记」AC 自动机 点击查看目录 目录 「学习笔记」AC 自动机 算法 问题 思路 代码 例题 Keywords Search 玄武密码 单词 病毒 最短母串 文本生成器 背单词 密码 禁忌 前置:「学习笔记」字符串基础:Hash,KMP与Trie。 好像对例题的讲解越来越抽象了? 算法 问题 求 \(n\) 个单词在一个长度为 \(m\) 的文章里出…

    算法与数据结构 2023年5月5日
    00
  • C++数据结构之文件压缩(哈夫曼树)实例详解

    我来为您详细讲解一下“C++数据结构之文件压缩(哈夫曼树)实例详解”这篇文章的完整攻略: 文章基本信息 标题:C++数据结构之文件压缩(哈夫曼树)实例详解 作者:Coder_XWG 发布时间:2019年12月24日 文章概述 该篇文章主要讲解了哈夫曼树在文件压缩方面的应用。通过实例讲解了如何使用哈夫曼编码将文件进行压缩,以及如何解压缩被压缩的文件,并对文章中…

    数据结构 2023年5月17日
    00
  • 数据结构之堆详解

    数据结构之堆详解 什么是堆? 堆(Heap)是一种特殊的树形数据结构。堆具有以下两个特点: 堆是一颗完全二叉树; 堆中每个节点的值都必须大于等于或小于等于其左右子节点的值,分别称作大根堆和小根堆。 上述的大根堆和小根堆其实是两种不同的堆的实现方式。对于大根堆,每个节点的值都比其左右子节点的值要大;小根堆则相反,每个节点的值都比其左右子节点的值要小。 堆的基本…

    数据结构 2023年5月17日
    00
  • Java数据结构之AC自动机算法的实现

    Java数据结构之AC自动机算法的实现 本文将详细讲解AC自动机算法在Java中的实现方法和原理,同时提供两个示例进行说明,使读者能够深入了解该算法并学会如何使用。 什么是AC自动机算法 AC自动机(Aho-Corasick Automaton)是多模式匹配的一种经典算法,其基本思路是将多个模式串构建成一颗“字典树”,然后对输入的文本串进行扫描匹配。相比于简…

    数据结构 2023年5月17日
    00
  • redis中hash数据结构及说明

    Redis中Hash数据结构及说明 简介 Redis中的Hash是一个string类型的field和value的映射表,可以将多个键值对存储在一个数据结构中,适合于存储对象。 通过HASH数据结构,我们可以方便的对单个field进行增删改查操作,增加了程序编写的方便性。 命令 以下是Hash数据结构的基础命令: HSET 将哈希表 key 中的域 field…

    数据结构 2023年5月17日
    00
  • 带你了解Java数据结构和算法之队列

    带你了解Java数据结构和算法之队列 一、介绍 队列是已知的最古老和最常用的数据结构之一。它是一个线性结构,它遵循一个先进先出的原则,在日常生活中我们也很容易碰到队列。比如:在银行排队办理业务、队列中的电影厅、厨房中的菜单等等。 队列的操作主要有两种:入队(enqueue)和出队(dequeue)。插入操作只能在队尾进行,删除操作只能在队头进行。还有一些常用…

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