sort

堆排序的python实现

只谈情不闲聊 提交于 2020-12-19 08:23:08
#--coding: utf8 -- # 堆排序的思想 -- 以大根堆为例: # 1) 构建堆 # 2) 把堆根取下来放到有序区去 -- 堆跟是当前堆上最大的数字 # 3) 此时堆没有根了,重新调整堆,然后重复1) - 3)直到堆成为一个空堆 # # 堆排序是选择排序的一种: 也是每次从未排序的区域选择一个值放入已排序的区域 # 它对直接选择排序的改进是: 对于以前已经比较过的结果可以保留下来:不用再重复比较:这也是堆的特性 def heap_sort(arr): build_heap(arr) arrlen = len(arr) for i in reversed(range(1, arrlen)): # 把堆跟(最大的值)放到最后面去 swap(arr, 0, i) # 重新调整堆 heapify(arr, 0, i - 1) def swap(arr, index1, index2): tmp = arr[index1] arr[index1] = arr[index2] arr[index2] = tmp def build_heap(arr): """ 以arr[0]到arr[(arrlen / 2)]为根的这些子树是需要调整的子树 其他的都是叶子节点 """ arrlen = len(arr) for i in reversed(range(0, (arrlen - 1

hive order by sort by

五迷三道 提交于 2020-04-07 07:13:02
order by Hive中的order by跟传统的sql语言中的order by作用是一样的,会对查询的结果做一次全局排序,所以说,所有的数据都会到同一个reducer进行处理(不管有多少map,也不管文件有多少的block只会启动一个reducer)。但是对于大量数据这将会消耗很长的时间去执行。适用于数据量小的场景 sort by Hive中指定了sort by,那么在每个reducer端都会做排序,也就是说保证了局部有序(每个reducer出来的数据是有序的,但是不能保证所有的数据是有序的,除非只有一个reduce),好处是:执行了局部排序之后可以为接下去的全局排序提高不少的效率(其实就是做一次归并排序就可以做到全局排序了)。 distribute by和sort by一起使用 distribute by是控制map的输出在reducer是如何划分的,举个例子,我们有一张表,mid是指这个store所属的商户,money是这个商户的盈利,name是这个store的名字 select midmoneyname store distribute by mid sort by mid ascmoney asc 我们所有的mid相同的数据会被送到同一个reducer去处理,每个reduce按照sort by 字段进行排序,这样的话就可以统计出每个商户中各个商店盈利的排序了(局部有序

oracle优化之count的优化-避免全表扫描

老子叫甜甜 提交于 2020-04-07 06:00:00
select count(*) from t1; 这句话比较简单,但很有玄机!对这句话运行的理解,反映了你对数据库的理解深度! 建立实验的大表他t1 SQL> conn scott/tiger 已连接。 SQL> drop table t1 purge; 表已删除。 SQL> create table t1 as select * from emp where 0=9; 表已创建。 SQL> insert into t1 select * from emp; 已创建14行。 SQL> insert into t1 select * from t1; 已创建14行。 SQL> / 已创建28行。 SQL> / 已创建56行。 SQL> / 已创建112行。 SQL> / 已创建224行。 SQL> / 已创建448行。 SQL> / 已创建896行。 SQL> / 已创建1792行。 SQL> / 已创建3584行。 SQL> / 已创建7168行。 SQL> / 已创建14336行。 SQL> / 已创建28672行。 SQL> / 已创建57344行。 SQL> commit; 提交完成。 收集统计信息 SQL> execute dbms_stats.gather_table_stats('SCOTT','T1'); PL/SQL 过程已成功完成。 SQL> SET AUTOT

链表排序--Sort List

…衆ロ難τιáo~ 提交于 2020-04-07 05:54:57
https://leetcode.com/problems/sort-list/ Sort List Sort a linked list in O ( n log n ) time using constant space complexity. 来自http://www.cnblogs.com/zuoyuan/p/3699508.html 南郭子綦 的解析 题目:链表的排序。要求:时间复杂度O(nlogn),空间复杂度O(1)。 解题思路:由于题目对时间复杂度和空间复杂度要求比较高,所以查看了各种解法,最好的解法就是归并排序,由于链表在归并操作时并不需要像数组的归并操作那样分配一个临时数组空间,所以这样就是常数空间复杂度了,当然这里不考虑递归所产生的系统调用的栈。      这里涉及到一个链表常用的操作,即快慢指针的技巧。设置slow和fast指针,开始它们都指向表头,fast每次走两步,slow每次走一步,fast到链表尾部时,slow正好到中间,这样就将链表截为两段。 1 # Definition for singly-linked list. 2 # class ListNode: 3 # def __init__(self, x): 4 # self.val = x 5 # self.next = None 6 7 class Solution: 8 # @param

Hive的sort by, order by, distribute by, cluster by区别?

泪湿孤枕 提交于 2020-04-07 05:49:53
Hive的order by语句和其他的SQL语言的定义是一样的,其会对查询结果集执行一个全局排序。这也就是说会有一个所有的数据都通过一个reducer进行处理的过程。对于大数据集,这个过程可能会消耗太过漫长的时间来执行。 Hive增加了一个可供选择的方式,也就是sort by,其只会在每个reducer中对数据进行排序,也就是执行一个局部排序的过程。这可以保证每个reducer的输出数据都是有序的(但并非全局有序)。这样就可以提高后面进行的全局排序的效率。 使用sort by,你可以指定执行的reduce个数(set mapred.reduce.tasks=<number>),对输出的数据再执行归并排序,即可以得到全部结果。 要想使用Hive实现全排序: 1.使用order by,但这样默认了reducer个数为1,效率低下。 2.使用sort by + order by。sort by会保证每个reducer的输出文件是有序的(其实是废话,每个reducer的输出当然是有序的!),要想实现全排序,还得加一个order by的过程,就是对sort by的reduce输出结果再进行一次排序。sort by为每个reducer产生一个排序文件。在有些情况下,你需要控制某个特定行应该到哪个reducer,通常是为了进行后续的聚集操作。hive的distribute by 就派上用场了:

Hadoop Hive 中几种排序方法的区别与比较

无人久伴 提交于 2020-04-07 05:49:29
Hive 中 Order by, Sort by ,Dristribute by, Cluster By 的作用和用法 1. order by set hive.mapred.mode=nonstrict; (default value / 默认值) set hive.mapred.mode=strict; order by 和数据库中的Order by 功能一致,按照某一项 & 几项 排序输出。 与数据库中 order by 的区别在于在hive.mapred.mode = strict 模式下 必须指定 limit 否则执行会报错。 hive> select * from test order by id; FAILED: Error in semantic analysis: 1:28 In strict mode, if ORDER BY is specified, LIMIT must also be specified. Error encountered near token 'id' 原因: 在order by 状态下所有数据会到一台服务器进行reduce操作也即只有一个reduce,如果在数据量大的情况下会出现无法输出结果的情况,如果进行 limit n ,那只有 n * map number 条记录而已。只有一个reduce也可以处理过来。 2. sort by

数组的sort方法原理

余生颓废 提交于 2020-04-07 01:42:47
数组中有两种可以排序的方法,reverse()和sort(),reverse()方法会反转数组项的顺序 let arr1 = [1,2,3,4,5] arr1.reverse() console.log(arr1) //[ 5, 4, 3, 2, 1 ] let arr2 = [1,2,6,4,5] arr2.reverse() console.log(arr2) //[ 5, 4, 6, 2, 1 ] 可以看到reverse()方法只会对数组进行反转,并没有真正的排序,因此有了 sort() 方法 sort()方法的原理是调用数组项的toString()方法,得到数组项的字符串,然后再比较字符串的Unicode码的顺序进行排序,即使数组中的每一项都是数值,比较的也是字符串的顺序。看下面的例子: let arr3 = [0, 1, 5, 10, 15] arr3.sort() console.log(arr3) //[ 0, 1, 10, 15, 5 ] 如上所见,虽然5小于10,但是在排序的时候还是排在了最后,这是因为排序的时候比较的是字符串,很显然这种排序方式不是我们想要的,因此sort方法可以接收一个比较函数作为参数,这样我们就可以自己指定哪个值位于前面哪个值排在后面。 一、升序排列 若 val1小于 val2,即 val1 - val2 小于零,则返回一个小于零的值

【LeetCode148】Sort List★★bug

帅比萌擦擦* 提交于 2020-04-06 11:42:11
1.题目描述: 2.解题思路:   本题是要堆一个链表进行排序,并且要求时间复杂度为 O ( n log n )。很明显,要用到分治的思想,用二分法进行归并排序:找到链表的middle节点,然后递归对前半部分和后半部分分别进行归并排序,最后对两个已排好序的链表进行Merge。   分为三步:   (1)找到中间结点,将链表分割成两部分。这里用到快慢两个指针的方法。   (2)对前后每一部分分别进行归并排序。这里用到递归。   (3)对两个已排好序的链表进行合并。这里用到前面merge 2 list的方法。    3.Java代码: //public class LeetCode148 为测试代码 public class LeetCode148 { public static void main(String[] args) { ListNode n1=new ListNode(3),n2=new ListNode(2),n3=new ListNode(1),n4=new ListNode(5); ListNode p=n1; n1.next=n2; n2.next=n3; n3.next=n4; System.out.print("初始时链表:"+p.val); while(p.next!=null){ System.out.print("->"+p.next.val); p=p

***148. Sort List 排序链表

做~自己de王妃 提交于 2020-04-06 11:36:48
1. 原始题目 在 O ( n log n ) 时间复杂度和常数级空间复杂度下,对链表进行排序。 示例 1: 输入: 4->2->1->3 输出: 1->2->3->4 示例 2: 输入: -1->5->3->4->0 输出: -1->0->3->4->5 2. 思路 归并排序。这道题两个递归解决。非常简洁。 快慢指针+归并排序 。 3. 解题 1 class Solution: 2 def sortList(self, head: ListNode) -> ListNode: 3 if not head or not head.next:return head 4 p,q = head, head.next 5 while(q and q.next): # 快慢指针,p最终指向中点 6 p = p.next 7 q = q.next.next 8 head2 = p.next 9 p.next = None 10 head = self.sortList(head) # 排好序的左链表 11 head2 = self.sortList(head2) # 排好序的右链表 12 head = self.merge(head,head2) # 合并两个排好序的链表 13 return head 14 15 def merge(self,head1,head2): #

一个对二维数组进行多字段多顺序排序的方法

点点圈 提交于 2020-04-06 05:28:14
1,代码 <?php /** * 对二维数组依次按照排序规则数组指定的字段和顺序进行排序,在有相同的情况下按下一个字段和顺序进行排序 * @param array $arr 待排序的数组 * @param array $fieldSortMap:排序规则数组, 一维关联数组,每个元素的键为排序字段名称,值为排序方向:SORT_ASC升序或SORT_DESC降序 * @return array */ function multiSortByFields(array $arr, array $fieldSortMap) { $count = count($arr); if ($count <= 1 || empty($fieldSortMap)) { return $arr; } $params = []; //将排序字段所拥有的值分别放入数组中,以备排序 foreach ($fieldSortMap as $field => $sort) { //field值数组,必须每个元素中都要有 $fieldValues = array_column($arr, $field); if (count($fieldValues) != $count) { return $arr; } //准备参数:依次分别是排序field的值数组和对应的排序方向(升序,降序) $params[] =