Sorting (Merge Sort, Rainball Sort, quick select) 总结

2024-09-04 13:38

本文主要是介绍Sorting (Merge Sort, Rainball Sort, quick select) 总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Merge k Sorted Lists (这题是用PQ,或者merge sort都可以做,关于第K大的问题,参考: Find Kth 题目类型总结)

Sort an Array (重点掌握merge sort和quick sort,因为两者可以演变为,divide conquer, quick select, 参考: Find Kth 题目类型总结)

Sort Colors 思路:三指针,i, j, k. 目标是 0 ,1 ,2 用i来保持0的位置,k来保持2的位置,j来做扫描运动,如果j遇见0,换到前面去,如果遇见2换到后面去。注意,如果换到前面的情况,i可以++,j也可以++,因为换回来的只可能是1,不可能是别的情况,因为前面的i部分已经被扫描过,2已经到后面去了。j遇见2,与后面进行互换的时候,j不能++,因为不知道换回来的是0,还是1,还是2,还得进行一次判断。这也是这个题目的考点。

Quick Select 题型参考: Find Kth 题目类型总结

Kth Smallest Numbers in Unsorted Array quick select的标准模板,一定要熟记,多写几次就熟悉了。

public class Solution {/*** @param k: An integer* @param nums: An integer array* @return: kth smallest element*/public int kthSmallest(int k, int[] nums) {if(nums == null || nums.length == 0) {return -1;}return findKth(nums, 0, nums.length - 1, k);}private int findKth(int[] A, int start, int end, int k) {if(start == end) {return A[start];}int mid = start + (end - start) / 2;int pivot = A[mid];int i = start, j = end;while(i <= j) {while(i <= j && A[i] < pivot) {i++;}while(i <= j && A[j] > pivot) {j--;}if(i <= j) {int temp = A[i];A[i] = A[j];A[j] = temp;i++;j--;}}if(start + k - 1 <= j) {return findKth(A, start, j, k);}if(start + k - 1 >= i) {return findKth(A, i, end, k - (i - start));}return A[j + 1];}
}

Sort List 思路:merge sort Linked List, jame bone,找到middle point的前一个,然后把list 劈开;

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public ListNode sortList(ListNode head) {if(head == null || head.next == null) {return head;}ListNode middlePre = findMiddlePre(head);ListNode newhead = middlePre.next;middlePre.next = null;ListNode l1 = sortList(head);ListNode l2 = sortList(newhead);return mergeTwoSortedList(l1, l2);}private ListNode findMiddlePre(ListNode head) {ListNode dummy = new ListNode(0);dummy.next = head; // 别忘记了,dummy.next = head,连起来;ListNode slow = dummy;ListNode fast = dummy;while(fast != null && fast.next != null && fast.next.next != null) {slow = slow.next;fast = fast.next.next;}return slow;}private ListNode mergeTwoSortedList(ListNode l1, ListNode l2) {ListNode dummy = new ListNode(0);ListNode cur = dummy;while(l1 != null && l2 != null) {if(l1.val < l2.val) {cur.next = l1;l1 = l1.next;cur = cur.next;} else {cur.next = l2;l2 = l2.next;cur = cur.next;}}if(l1 != null) {cur.next = l1;}if(l2 != null) {cur.next = l2;}return dummy.next;}
}

Merge Intervals (Interval 是一类很重要的题目,往往跟Sweep line相结合, 参考: 扫描线Sweep Line算法总结)

思路:首先按照start sort之后,判断end是否跟start相交,如果相交,end就是两者最大值;否则加入cur;注意最后需要加入cur;

Convert Sorted Array to Binary Search Tree 思路:找中间点,就是root,然后两边分别构造左子树和右子树。

Convert Sorted List to Binary Search Tree 思路:jame bond 的思路,找mid的前一个点,然后两边分开找;这里只传递一个参数;注意middle的前后都要断开,否则会死循环;

Search in Rotated Sorted Array 思路:按照九章的模板来写;总体思想就是:确定哪段是升序的,然后把target钳住里面,判断是否在里面,否则搜另外一边;因为array是rotated,所以,只能是两边要么一边升序,把target放在升序的序列里面进行判断,如果不在,选另外一边;

关于search,这里有Binary Search 总结 

这篇关于Sorting (Merge Sort, Rainball Sort, quick select) 总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1136165

相关文章

Go 语言中的select语句详解及工作原理

《Go语言中的select语句详解及工作原理》在Go语言中,select语句是用于处理多个通道(channel)操作的一种控制结构,它类似于switch语句,本文给大家介绍Go语言中的select语... 目录Go 语言中的 select 是做什么的基本功能语法工作原理示例示例 1:监听多个通道示例 2:带

C++ Sort函数使用场景分析

《C++Sort函数使用场景分析》sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变,如果某些场景需要保持相同元素间的相对顺序,可使... 目录C++ Sort函数详解一、sort函数调用的两种方式二、sort函数使用场景三、sort函数排序

java常见报错及解决方案总结

《java常见报错及解决方案总结》:本文主要介绍Java编程中常见错误类型及示例,包括语法错误、空指针异常、数组下标越界、类型转换异常、文件未找到异常、除以零异常、非法线程操作异常、方法未定义异常... 目录1. 语法错误 (Syntax Errors)示例 1:解决方案:2. 空指针异常 (NullPoi

Java反转字符串的五种方法总结

《Java反转字符串的五种方法总结》:本文主要介绍五种在Java中反转字符串的方法,包括使用StringBuilder的reverse()方法、字符数组、自定义StringBuilder方法、直接... 目录前言方法一:使用StringBuilder的reverse()方法方法二:使用字符数组方法三:使用自

Python依赖库的几种离线安装方法总结

《Python依赖库的几种离线安装方法总结》:本文主要介绍如何在Python中使用pip工具进行依赖库的安装和管理,包括如何导出和导入依赖包列表、如何下载和安装单个或多个库包及其依赖,以及如何指定... 目录前言一、如何copy一个python环境二、如何下载一个包及其依赖并安装三、如何导出requirem

HTML5中下拉框<select>标签的属性和样式详解

《HTML5中下拉框<select>标签的属性和样式详解》在HTML5中,下拉框(select标签)作为表单的重要组成部分,为用户提供了一个从预定义选项中选择值的方式,本文将深入探讨select标签的... 在html5中,下拉框(<select>标签)作为表单的重要组成部分,为用户提供了一个从预定义选项中

Rust格式化输出方式总结

《Rust格式化输出方式总结》Rust提供了强大的格式化输出功能,通过std::fmt模块和相关的宏来实现,主要的输出宏包括println!和format!,它们支持多种格式化占位符,如{}、{:?}... 目录Rust格式化输出方式基本的格式化输出格式化占位符Format 特性总结Rust格式化输出方式

Python中连接不同数据库的方法总结

《Python中连接不同数据库的方法总结》在数据驱动的现代应用开发中,Python凭借其丰富的库和强大的生态系统,成为连接各种数据库的理想编程语言,下面我们就来看看如何使用Python实现连接常用的几... 目录一、连接mysql数据库二、连接PostgreSQL数据库三、连接SQLite数据库四、连接Mo

Git提交代码详细流程及问题总结

《Git提交代码详细流程及问题总结》:本文主要介绍Git的三大分区,分别是工作区、暂存区和版本库,并详细描述了提交、推送、拉取代码和合并分支的流程,文中通过代码介绍的非常详解,需要的朋友可以参考下... 目录1.git 三大分区2.Git提交、推送、拉取代码、合并分支详细流程3.问题总结4.git push

SQL Server使用SELECT INTO实现表备份的代码示例

《SQLServer使用SELECTINTO实现表备份的代码示例》在数据库管理过程中,有时我们需要对表进行备份,以防数据丢失或修改错误,在SQLServer中,可以使用SELECTINT... 在数据库管理过程中,有时我们需要对表进行备份,以防数据丢失或修改错误。在 SQL Server 中,可以使用 SE