排序算法

数据结构-桶排序 计数排序 基数排序

眉间皱痕 提交于 2020-03-03 15:38:23
文章目录 桶排序(Bucket sort) 简介 时间复杂度 使用场景 计数排序(Counting sort) 简介 例子 代码实现 总结 基数排序(Radix sort) 简介 使用场景 代码实现 总结 注:所有的代码在我的 Github 中有均具体C++代码实现。 这里主要讲的是三大 线性排序 :桶排序(Bucket sort)、计数排序(Counting sort)和基数排序(Radix sort)。 所谓线性排序,也就是说时间复杂度为 O(n),而之所以能够做到线性排序,是因为这三个算法是 非基于比较 的排序算法,都不涉及元素之间的比较操作。 桶排序(Bucket sort) 简介 顾名思义,会用到“桶”,核心的思想就是将要排序的数据分到几个有序的桶里面,然后每个桶再进行单独的排序。桶内的数据排序过后,再把每个桶里面的数据依次取出,这样组成的序列就是有序的了。 时间复杂度 如果要排序的数据有 n 个,我们把它们均匀地划分到 m 个桶内,每个桶里就有 k=n/m 个元素。每个桶内部使用快速排序,时间复杂度为 O(k * logk)。m 个桶排序的时间复杂度就是 O(m * k * logk),因为 k=n/m,所以整个桶排序的时间复杂度就是 O(n*log(n/m))。当桶的个数 m 接近数据个数 n 时,log(n/m) 就是一个非常小的常量,这个时候桶排序的时间复杂度接近

java技能提升计划

让人想犯罪 __ 提交于 2020-03-03 07:14:19
近日向领导汇报工作时,发现自己工作两年多来,在技能提升方面,始终是基于需求驱动,自主学习的觉悟比较不足,于是在网上搜索汇总得到以下java技能提升的一些知识点,粗略扫了一遍,发现一知半解甚至没有接触过的内容比较多,始知自身所掌握之局限。便开通了这个CSDN账号,计划在日后工作之余,有选择地研究下面的一些重要知识点。每次学习所得的内容,我会另开文章记录学习过程中的思考、疑惑、结论等,供自己日后回顾,若能惠及他人,也是我的荣幸。希望能够坚持下去。 一、基础篇 面向对象 什么是面向对象 面向对象、面向过程 面向对象的三大基本特征和五大基本原则 平台无关性 Java如何实现的平台无关 JVM还支持哪些语言(Kotlin、Groovy、JRuby、Jython、Scala) 值传递 值传递、引用传递 为什么说Java中只有值传递 封装、继承、多态 什么是多态、方法重写与重载 Java的继承与实现 构造函数与默认构造函数 类变量、成员变量和局部变量 成员变量和方法作用域 Java基础知识 基本数据类型 7种基本数据类型:整型、浮点型、布尔型、字符型 整型中byte、short、int、long的取值范围 什么是浮点型?什么是单精度和双精度?为什么不能用浮点型表示金额? 自动拆装箱 什么是包装类型、什么是基本类型、什么是自动拆装箱 Integer的缓存机制 String 字符串的不可变性 JDK

.sort与sorted的区别

£可爱£侵袭症+ 提交于 2020-03-02 18:37:22
list.sort 方法会就地排序列表,也就是说不会把原列表复制一份。这 也是这个方法的返回值是 None 的原因,提醒你本方法不会新建一个列 表。在这种情况下返回 None 其实是 Python 的一个惯例:如果一个函数 或者方法对对象进行的是就地改动,那它就应该返回 None,好让调用 者知道传入的参数发生了变动,而且并未产生新的对象。例 如,random.shuffle 函数也遵守了这个惯例。  用返回 None 来表示就地改动这个惯例有个弊端,那就是调用 者无法将其串联起来。而返回一个新对象的方法(比如说 str 里的 所有方法)则正好相反,它们可以串联起来调用,从而形成连贯接 口(fluent interface)。详情参见维基百科中有关连贯接口的讨论 (https://en.wikipedia.org/wiki/Fluent_interface)。 与 list.sort 相反的是内置函数 sorted,它会新建一个列表作为返回 值。这个方法可以接受任何形式的可迭代对象作为参数,甚至包括不可 变序列或生成器(见第 14 章)。而不管 sorted 接受的是怎样的参 数,它最后都会返回一个列表。 不管是 list.sort 方法还是 sorted 函数,都有两个可选的关键字参 数。 reverse   如果被设定为 True,被排序的序列里的元素会以降序输出(也就

归并排序——MergeSort实现(Java)

蓝咒 提交于 2020-03-02 17:52:57
根据大佬们的一些构思和做法,自己实现了归并算法,总体利用递归实现,空间消耗的还是比较大,mergesort方法的空间复杂度就在O(N). package 数据结构_排序 ; public class 归并排序 { public static void main ( String [ ] args ) { int [ ] arr = { 1 , 8 , 36 , 5 , 2 , 4 , 6 } ; MergeSort sort = new MergeSort ( ) ; sort . mergeSort ( arr , 0 , arr . length - 1 ) ; for ( int i : arr ) { System . out . print ( i + " " ) ; } } } class MergeSort { /** * * @param a add a list of need sort * @param start where you start sorting * @param end where you end sorting */ public void mergeSort ( int [ ] a , int start , int end ) { //当拆分至最后一个停止拆分,否则递归拆分 if ( start < end ) { int mid = (

Spark 性能相关参数配置详解-shuffle篇

穿精又带淫゛_ 提交于 2020-03-02 17:49:33
随着 Spark 的逐渐成熟完善, 越来越多的可配置参数被添加到Spark中来, 在Spark的官方文档http://spark.apache.org/docs/latest/configuration.html 中提供了这些可配置参数中相当大一部分的说明. 但是文档的更新总是落后于代码的开发的, 还有一些配置参数没有来得及被添加到这个文档中, 最重要的是在这个文档中,对于许多的参数也只能简单的介绍它所代表的内容的字面含义, 如果没有一定的实践基础或者对其背后原理的理解, 往往无法真正理解该如何针对具体应用场合进行合理配置。 本文试图通过阐述这其中部分参数的工作原理和配置思路, 和大家一起探讨一下如何根据实际场合对Spark进行配置优化。需要注意的是,理论上,没有绝对正确的配置(否则也就不需要对应的配置参数了,Spark框架内部直接写死就好了),所以请结合自己的实际情况,辩证的看下面的内容。 由于本文主要针对和性能相关的一些配置参数进行阐述,所以基本不会覆盖其它和性能没有太多关系的配置参数。 由于篇幅较长,所以在这里分篇组织,如果要看最新完整的网页版内容,可以戳这里: http://spark-config.readthedocs.org/ ,主要是便于更新内容 Shuffle 相关 Shuffle操作大概是对Spark性能影响最大的步骤之一(因为可能涉及到排序,磁盘IO

二次排序问题(分别使用Hadoop和Spark实现)

丶灬走出姿态 提交于 2020-03-02 12:35:15
  不多说,直接上干货!   这篇博客里的算法部分的内容来自《数据算法:Hadoop/Spark大数据处理技巧》一书,不过书中的代码虽然思路正确,但是代码不完整,并且只有java部分的编程,我在它的基础上又加入scala部分,当然是在使用Spark的时候写的scala。 一、输入、期望输出、思路。 输入为SecondarySort.txt,内容为: 2000,12,04,10 2000,11,01,20 2000,12,02,-20 2000,11,07,30 2000,11,24,-40 2012,12,21,30 2012,12,22,-20 2012,12,23,60 2012,12,24,70 2012,12,25,10 2013,01,23,90 2013,01,24,70 2013,01,20,-10 意义为:年,月,日,温度 期望输出: 2013-01 90,70,-10 2012-12 70,60,30,10,-20 2000-12 10,-20 2000-11 30,20,-40 意义为: 年-月 温度1,温度2,温度3,…… 年-月从上之下降序排列, 温度从左到右降序排列 思路: 抛弃不需要的代表日的哪一行数据 将年月作为组合键(key),比较大小,降序排列 将对应年月(key)的温度的值(value)进行降序排列和拼接 二

NOIP需要掌握的内容(大致

旧街凉风 提交于 2020-03-02 11:41:13
1、 排序算法(快排、选择、冒泡、堆排序、 二叉排序树 、桶排序) 2、 DFS/BFS 剪枝 哈希表 3、树 ① 遍历 ② 二叉树 ③二叉排序树(查找、生成、删除) ④堆(二叉堆、左偏树、堆排序) ⑤Trie树 4、图(图论建模) ① 最小生成树 ② 最短路径 ③计算图的传递闭包 ④ 连通分量(其中要掌握并查集技术) 强连通分量tarjin ⑤ 拓扑排序 、关键路径 ⑥哈密尔顿环 ⑦ 欧拉回路 (USACO 3.3 题1 Fence) ⑧ Bell-man Ford、SPFA(能解决负权回路) (USACO 3.2 题6 Butter) ⑨二分图(匈牙利算法)(USACO 4.2 题2 stall) 5、动态规划(背包问题只是其中一种) ① 线性动规 ② 区间动规 ③ 树形动规 ④图形动规 6、 分治 (掌握了动规分治就好学了) 7、 贪心 8、 位运算 (可以用来进行优化) 来源: https://www.cnblogs.com/GldHkkowo/p/8710834.html

排序数组转变为平衡二叉树

守給你的承諾、 提交于 2020-03-02 10:28:06
原题   Given an array where elements are sorted in ascending order, convert it to a height balanced BST. 题目大意   给定一个升序排列的二叉树,将其转换为一棵高度平衡的二叉树。 解题思路   采用递归分治法。 代码实现 树结点类 public class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } 1 2 3 4 5 6 1 2 3 4 5 6 算法 实现类 public class Solution { public TreeNode sortedArrayToBST(int[] nums) { // 参数检验 if (nums == null || nums.length < 1) { return null; } // 递归分治法求解 return solve(nums, 0, nums.length - 1); } /** * 递归分治求解方法 * * @param nums 升序排序数组 * @param start 开始位置 * @param end 结束位置 * @return 根结点 */ public TreeNode solve(int[]

常用数据结构以及数据结构的排序算法

耗尽温柔 提交于 2020-03-02 02:39:24
数组 (Array)   在程序设计中,为了处理方便, 把具有相同类型的若干 变量 按有序的形式组织起来。这些按序排列的同类数据元素的集合称为 数组 。在C语言中, 数组属于构造数据类型。一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。因此按数组元素的类型不同,数组又可分为数值数组、字符数组、 指针数组 、结构数组等各种类别。 栈 (Stack)   是只能在某一端插入和删除的特殊 线性表 。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。 队列 (Queue)   一种特殊的 线性表 ,它只允许在表的 前端 (front)进行删除操作,而在表的后端(rear)进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。 链表 (Linked List)   是一种物理存储单元上非连续、非顺序的存储结构,数据元素的 逻辑顺序 是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时 动态 生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 树 (Tree)   是包含n(n>0)个结点的有穷集合K,且在K中定义了一个关系N,N满足 以下条件:  

golang实现常用排序算法

老子叫甜甜 提交于 2020-03-02 02:12:56
1.冒泡排序,算法复杂度O(n^2) package main import ( "fmt" ) func main() { var arr = []int{10, 17, 19, 18, 77, 55} for i := 0; i < len(arr)-1; i++ { for j := i + 1; j < len(arr); j++ { if arr[i] > arr[j] { arr[i], arr[j] = arr[j], arr[i] } } } fmt.Println(arr) } 2.快速排序 它的基本思想是:通过一趟排序将数据一分为二,其中一部分的所有数据都比另外一部分的所有数据都要小,然后对两部分递归,直至完成。时间复杂度介于O(nlogn)和O(n^2) 一趟快速排序的算法是: 1)设置两个 变量 i、j, 排序 开始的时候:i=0,j=N-1; 2)以第一个 数组 元素作为关键数据,赋值给 key ,即 key =A[0]; 3)从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于 key 的值A[j],将A[j]赋给A[i]; 4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于 key 的A[i],将A[i]赋给A[j]; 5)重复第3、4步,直到i=j; package main import ( "fmt" ) func