java数据结构与算法(链表快排)

以下内容是被验证可以高效理解该算法且方便实践的。如果你发现还有很多需要增加的,欢迎留言。 

前言

链表的快速排序方法和数组的快速排序还存在较大差异,深入理解的基础上再动手试试吧。每日更新2题,希望学习的小伙伴可以关注一波。评论区欢迎讨论交流。

实现原理

链表快速排序的原理与数组快速排序相似,但在实现上有一些不同。链表快速排序的主要思想是通过分治法将原链表分割成若干个子链表,然后分别对这些子链表进行排序,最后将排好序的子链表合并起来。

下面是链表快速排序的基本步骤:

  1. 选择基准点(Pivot): 从链表中选择一个节点作为基准点。这个选择可以是任意的,常见的选择方式包括:

    • 选择第一个节点作为基准点。
    • 选择中间节点作为基准点。
    • 随机选择一个节点作为基准点。
  2. 分割链表: 遍历链表,将链表中的节点根据其值与基准点的大小关系分割成三部分:小于基准点的节点、等于基准点的节点和大于基准点的节点。通常使用三个指针来维护这三部分链表。

  3. 递归排序: 对小于基准点和大于基准点的两部分链表递归地应用快速排序算法。

  4. 合并结果: 将排好序的小于基准点的链表、等于基准点的链表和大于基准点的链表连接起来,形成最终的有序链表

链表的快速排序相对于数组的快速排序,主要有以下两个区别:

  • 在链表中找到中间点的时间复杂度是 O(n),而在数组中是 O(1)。这会影响到基准点的选择。
  • 在链表中分割节点需要重新组织节点的连接关系,相对于数组中的交换操作,这需要更多的操作,但由于链表的特性,不会像数组那样导致额外的复杂度。

具体代码实现

import java.util.Random;class ListNode {int val;ListNode next;ListNode(int x) {val = x;}
}public class QuickSortLinkedList {public ListNode sortList(ListNode head) {if (head == null || head.next == null)return head;// Step 1: Partition the list around a pivotListNode pivot = head;ListNode lessHead = new ListNode(0);ListNode equalHead = new ListNode(0);ListNode greaterHead = new ListNode(0);ListNode lessPtr = lessHead, equalPtr = equalHead, greaterPtr = greaterHead;ListNode curr = head;while (curr != null) {if (curr.val < pivot.val) {lessPtr.next = curr;lessPtr = lessPtr.next;} else if (curr.val == pivot.val) {equalPtr.next = curr;equalPtr = equalPtr.next;} else {greaterPtr.next = curr;greaterPtr = greaterPtr.next;}curr = curr.next;}// Combine less, equal, and greater listslessPtr.next = null;equalPtr.next = null;greaterPtr.next = null;// Step 2: Recursively sort the less and greater listsListNode sortedLess = sortList(lessHead.next);ListNode sortedGreater = sortList(greaterHead.next);// Step 3: Combine the sorted listsListNode sortedHead = concatLists(sortedLess, equalHead.next);sortedHead = concatLists(sortedHead, sortedGreater);return sortedHead;}private ListNode concatLists(ListNode list1, ListNode list2) {if (list1 == null) return list2;ListNode curr = list1;while (curr.next != null) {curr = curr.next;}curr.next = list2;return list1;}public void printList(ListNode node){ListNode current=node;while(current!=null){System.out.println(current.val);current=current.next;}}public static void main(String[] args) {QuickSortLinkedList quickSortLinkedList=new QuickSortLinkedList();ListNode headA=new ListNode(1);Random random=new Random();ListNode currentA=headA;for(int i=5;i>0;i--){currentA.next=new ListNode(i);currentA=currentA.next;}ListNode res=quickSortLinkedList.sortList(headA);quickSortLinkedList.printList(res);}}

QA:待定

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/10158.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI技术构建本地知识库的流程

构建本地知识库是一个复杂的过程&#xff0c;涉及以下几个步骤&#xff0c;使用大模型技术构建本地知识库是一种很有前途的方法。随着大模型技术的不断发展&#xff0c;我们可以期待本地知识库将变得更加智能、高效和准确。北京木奇移动技术有限公司&#xff0c;专业的软件外包…

设计模式1——初步认识篇

设计模式1——初步认识篇 一、先让我们浅聊一下面向对象和设计模式。 说起设计模式&#xff0c;我第一次听到它&#xff0c;是在学习面向对象的时候。那么什么是面向对象&#xff0c;什么是设计模式&#xff0c;而且设计模式和面向对象又有什么关系呢&#xff1f; 1、什么是面…

你不知道的ConstraintLayout高级用法

文章目录 1. ConstraintLayout介绍2. 高级用法2.1 Gone Margin2.2 偏移2.3 居中2.4 尺寸约束2.5 链2.6 角度定位&#xff08;圆形定位&#xff09; 3. 工具类3.1 Guideline&#xff08;参考线&#xff09;3.2 Barrier&#xff08;栅栏&#xff09;3.3 Group&#xff08;组&…

路由发布中的前缀列表的使用方法 ip prefix-list

路由重发布中的前缀列表 一、前缀列表的特点&#xff1a; &#xff08;1&#xff09;、可以增量修改&#xff0c;我们知道对于普通访问控制列表&#xff0c;我们不能删除该列表中的某个条目&#xff0c;如果想删除列表中的某个条目只能将该访问列表全部删除&#xff0c;而前缀…

【Camera2完整流程分析四】从log角度分析CameraService启动流程

下面直接带你通过log打印来一起读CameraService启动的过程。 1)Camera service对象构建,在启动的时候先创建CameraService 这里会打印: CameraService: CameraService started (pid=559)接着启动的时候会执行 –》onFirstRef() 进入这里面看,先输出打印: CameraService:…

信息与未来2017真题笔记

T1. 龟兔赛跑 题目描述 兔子又来找乌龟赛跑啦&#xff01;同样的错误兔子不会犯两次&#xff0c;所以兔子提出赛跑的时候&#xff0c;乌龟就觉得这场比赛很不公平。于是兔子进一步放宽了条件&#xff0c;表示他可以在比赛开始以后先睡 t t t 分钟再开始追乌龟。 乌龟这下没…

YOLOv5改进 | 注意力机制 | 用于移动端的高效坐标CA注意力机制

在深度学习目标检测领域&#xff0c;YOLOv5成为了备受关注的模型之一。本文给大家带来的是能用于移动端的高效坐标CA注意力机制。文章在介绍主要的原理后&#xff0c;将手把手教学如何进行模块的代码添加和修改&#xff0c;并将修改后的完整代码放在文章的最后&#xff0c;方便…

答辩PPT不会做?试试这些AI工具,一键生成

在我原本的认知里面&#xff0c;答辩PPT是要包含论文各个章节的&#xff0c;在答辩时需要方方面面都讲到的&#xff0c;什么摘要、文献综述、实证分析、研究结果样样不落。但是&#xff0c;这大错特错&#xff01; 答辩PPT环节时长一般不超过5分钟&#xff0c;老师想要的答辩P…

25、Flink 支持的数据类型及序列化详解

数据类型及序列化 1.概览 a&#xff09;概述 Flink 以其独特的方式来处理数据类型及序列化&#xff0c;包括它自身的类型描述符、泛型类型提取以及类型序列化框架。 支持的数据类型 Java Tuples and Scala Case Classes Java POJOs Primitive Types Regular Classes Value…

PMP证书如何备考?

每个过了PMP考试的考生&#xff1a;“你是如何学习和准备的”&#xff1f;答案基本分三类&#xff1a; 第一种是“临时抱佛脚”式&#xff1b;第二种是“持续抗战式”&#xff1b;第三种是“疲劳作战式”。 第一种比较符合人性和期望—20世纪三大管理定义之一的帕金斯定律&am…

qt窗口置顶

设置Qt::WindowStaysOnTopHint this->setWindowFlags(Qt::Tool| Qt::FramelessWindowHint|Qt::WindowStaysOnTopHint|Qt::X11BypassWindowManagerHint);Qt::WindowStaysOnTopHint帮助文档 Informs the window system that the window should stay on top of all other wind…

java双亲委派

双亲委派&#xff08;Parent Delegation&#xff09;是Java类加载机制中的一种设计模式&#xff0c;用于确保类的加载安全性和一致性。在双亲委派模式下&#xff0c;一个类加载器在加载类时首先委托给其父类加载器&#xff0c;只有在父类加载器无法加载该类时&#xff0c;才由子…

springmvc数据绑定

数据绑定 数据绑定流程 springmvc框架将ServletRequest对象及目标方法的入参实例传递给WebDataBinderFactory实例&#xff0c;以创建DataBinder实例对象 DataBinder调用装配在springmvc上下文中的ConversionService组件进行数据类型转换、数据格式化工作。将Servlet中的请求信息…

Frida逆向与利用自动化

title: Frida逆向与利用自动化 date: 2022-05-01 21:22:20 tags: frida categories:安卓逆向 toc_number: trueKali kali里面时间老是不对,其实只是时区不对而已,一个命令就搞定: dpkg-reconfigure tzdata 然后选择Asia→Shanghai,然后重启即可。 KaliLinux默认不带中文 a…

ctfshow web入门 php反序列化 web267--web270

web267 查看源代码发现这三个页面 然后发现登录页面直接admin/admin登录成功 然后看到了 ///backdoor/shell unserialize(base64_decode($_GET[code]))EXP <?php namespace yii\rest{class IndexAction{public $checkAccess;public $id;public function __construct(){…

C语言-STM32:初始定时器(通用定时器)

STM32定时器的作用&#xff1a; STM32定时器是一个重要的硬件资源&#xff0c;主要用于以下几种用途&#xff1a; 计数&#xff1a;它可以用来计数外部事件的次数&#xff0c;例如脉冲或信号的周期。定时&#xff1a;定时器可以设置一个特定的时间间隔后产生中断&#xff0c;用…

【Java处理word文档】

Java处理word文档 前言一、word是什么&#xff1f;二、Java处理word2.1、依赖包2.2、加载word样式2.3、读入文件2.4、单一样式段落2.5、复合样式段落2.6、将段落写入word2.7、word表格2.8、超链接2.9、写入样式及文件保存 总结示例源码样式xmlWordConstantWordStylesUtilWordUt…

Windows Server 2012 R2 新增D盘分区

我们经常搭建windows版本的游戏时会要在D盘上操作&#xff0c;今天就介绍下新的服务器如何新增一个D盘。 在"开始"图标右边有个”服务器管理器“&#xff0c;单击点开 点开服务器管理器后&#xff0c;点击“工具”打开“计算机管理” 打开计算机管理后点击“存储”-…

QT切换控件布局

1、切换前垂直布局 2、切换后水平布局 3、关键代码 qDebug() << "开始切换布局";QWidget *widget centralWidget();QLayout *layout widget->layout();if(layout){while(layout->count()){QLayoutItem *item layout->takeAt(0);if(item->layout…