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

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

git使用的说明总结

Git使用说明 下载安装(下载地址) macOS: Git - Downloading macOS Windows: Git - Downloading Windows Linux/Unix: Git (git-scm.com) 创建新仓库 本地创建新仓库:创建新文件夹,进入文件夹目录,执行指令 git init ,用以创建新的git 克隆仓库 执行指令用以创建一个本地仓库的

二分最大匹配总结

HDU 2444  黑白染色 ,二分图判定 const int maxn = 208 ;vector<int> g[maxn] ;int n ;bool vis[maxn] ;int match[maxn] ;;int color[maxn] ;int setcolor(int u , int c){color[u] = c ;for(vector<int>::iter

整数Hash散列总结

方法:    step1  :线性探测  step2 散列   当 h(k)位置已经存储有元素的时候,依次探查(h(k)+i) mod S, i=1,2,3…,直到找到空的存储单元为止。其中,S为 数组长度。 HDU 1496   a*x1^2+b*x2^2+c*x3^2+d*x4^2=0 。 x在 [-100,100] 解的个数  const int MaxN = 3000

状态dp总结

zoj 3631  N 个数中选若干数和(只能选一次)<=M 的最大值 const int Max_N = 38 ;int a[1<<16] , b[1<<16] , x[Max_N] , e[Max_N] ;void GetNum(int g[] , int n , int s[] , int &m){ int i , j , t ;m = 0 ;for(i = 0 ;

go基础知识归纳总结

无缓冲的 channel 和有缓冲的 channel 的区别? 在 Go 语言中,channel 是用来在 goroutines 之间传递数据的主要机制。它们有两种类型:无缓冲的 channel 和有缓冲的 channel。 无缓冲的 channel 行为:无缓冲的 channel 是一种同步的通信方式,发送和接收必须同时发生。如果一个 goroutine 试图通过无缓冲 channel

easyui 验证下拉菜单select

validatebox.js中添加以下方法: selectRequired: {validator: function (value) {if (value == "" || value.indexOf('请选择') >= 0 || value.indexOf('全部') >= 0) {return false;}else {return true;}},message: '该下拉框为必选项'}

9.8javaweb项目总结

1.主界面用户信息显示 登录成功后,将用户信息存储在记录在 localStorage中,然后进入界面之前通过js来渲染主界面 存储用户信息 将用户信息渲染在主界面上,并且头像设置跳转,到个人资料界面 这里数据库中还没有设置相关信息 2.模糊查找 检测输入框是否有变更,有的话调用方法,进行查找 发送检测请求,然后接收的时候设置最多显示四个类似的搜索结果