sort

noip模拟题《序》sort

拥有回忆 提交于 2020-01-27 04:48:40
【问题背景】 zhx 给他的妹子们排序。 【问题描述】 zhx有N个妹子,他对第i个妹子的好感度为a i , 且所有a i 两两不相等。现在N个妹子随意站成一 排,他要将她们根据好感度从小到大排序。 他使用的是冒泡排序算法。如果排序过程中 好感度为a i 的妹子和好感度为a j 的妹子发生了交换, 那么她们之间会发生一场口角。 现在 zhx 想知道, 给定妹子的初始排列, 在排序完成后, 最多存在多少个妹子, 她们任意两 人之间没发生过口角。 正式地, 考虑对数组ai进行冒泡排序, 如果ai和aj在排序过程中发生交换,那么在两个元素之 间连一条边。你需要求出,排序结束后,最多存在多少个元素,其中任意两个元素之间不存在连边。 【输入格式】 第一行两个整数 N, 表示妹子数量。 接下来一行 N 个整数ai,表示初始第 i 个妹子的好感度。 【输出格式】 一行一个整数, 表示最多满足要求的妹子的个数。 【样例输入】 3 3 1 2 【样例输出】 2 【样例解释】 {1, 2}。 【数据规模与约定】 对于30%的数据, 1 ≤n≤ 16。 对于70%的数据, 1 ≤n≤ 5000。 对于100%的数据, 1 ≤n≤ 100000, 0 ≤ai<n。 (当时看到实在不会做啊,还是QTY_YTQ神说这就是求最长上升子序列长度,好劲啊) 就是i和j两个妹子不交换,当且仅当ai<aj

[leetcode]Sort List @ Python

江枫思渺然 提交于 2020-01-27 03:19:11
原题地址:http://oj.leetcode.com/problems/sort-list/ 题意:链表的排序。要求:时间复杂度O(nlogn),空间复杂度O(1)。 解题思路:由于题目对时间复杂度和空间复杂度要求比较高,所以查看了各种解法,最好的解法就是归并排序,由于链表在归并操作时并不需要像数组的归并操作那样分配一个临时数组空间,所以这样就是常数空间复杂度了,当然这里不考虑递归所产生的系统调用的栈。      这里涉及到一个链表常用的操作,即快慢指针的技巧。设置slow和fast指针,开始它们都指向表头,fast每次走两步,slow每次走一步,fast到链表尾部时,slow正好到中间,这样就将链表截为两段。      运行时需要将中文注释删掉,leetcode oj平台里面不支持中文字符。 代码: # Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.val = x # self.next = None class Solution: # @param head, a ListNode # @return a ListNode def merge(self, head1, head2): if head1 == None: return head2 if

十大排序算法(Java实现)

。_饼干妹妹 提交于 2020-01-26 22:33:37
一、冒泡排序(Bubble Sort) public class BubbleSort { public static void main(String[] args) { int[] arr = {3, 4, 2, 9, 10, 15, 11, 0, 1}; System.out.println(Arrays.toString(bubbleSort(arr))); } public static int[] bubbleSort(int[] arr){ for (int i = 0; i < arr.length - 1; i++) { for(int j = 0; j < arr.length - 1 - i; j++){ if(arr[j] > arr[j + 1]){ int temp = arr[j + 1]; arr[j + 1] = arr[j]; arr[j] = temp; } } } return arr; } } 二、选择排序(Selection Sort) public class SelectionSort { public static void main(String[] args) { int[] arr = {3, 4, 2, 9, 10, 15, 11, 0, 1}; System.out.println(Arrays.toString

高效的使用STL

血红的双手。 提交于 2020-01-26 18:45:13
高效的使用STL 仅仅是个选择的问题,都是STL,可能写出来的效率相差几倍; 熟悉以下条款,高效的使用STL; 当对象很大时,建立指针的容器而不是对象的容器 1)STL基于拷贝的方式的来工作,任何需要放入STL中的元素,都会被复制; 这也好理解,STL工作的容器是在堆内开辟的一块新空间,而我们自己的变量一般存放在函数栈或另一块堆空间中;为了能够完全控制STL自己的元素,为了能在自己的地盘随心干活;这就涉及到复制; 而如果复制的对象很大,由复制带来的性能代价也不小 ; 对于大对象的操作,使用指针来代替对象能消除这方面的代价; 2)只涉及到指针拷贝操作, 没有额外类的构造函数和赋值构造函数的调用; vecttor <BigObj> vt1; vt1.push_bach(myBigObj); vecttor <BigObj* > vt2; vt2.push_bach(new BigObj()); 注意事项: 1)容器销毁前需要自行销毁指针所指向的对象;否则就造成了内存泄漏; 2)使用排序等算法时,需要构造基于对象的比较函数,如果使用默认的比较函数,其结果是基于指针大小的比较,而不是对象的比较; 用empty() 代替size()来检查是否为空 因为对于list,size()会遍历每一个元素来确定大小,时间复杂度 o(n),线性时间;而empty总是保证常数时间;

枚举,模拟与排序

混江龙づ霸主 提交于 2020-01-26 15:53:36
(一)枚举与模拟 1.连号区间数 小明这些天一直在思考这样一个奇怪而有趣的问题: 在 1 ∼ N 的某个排列中有多少个连号区间呢? 这里所说的连号区间的定义是: 如果区间 [ L , R ] 里的所有元素(即此排列的第 L 个到第 R 个元素)递增排序后能得到一个长度为 R − L + 1 的“连续”数列,则称这个区间连号区间。 当 N 很小的时候,小明可以很快地算出答案,但是当 N 变大的时候,问题就不是那么简单了,现在小明需要你的帮助。 输入格式 第一行是一个正整数 N ,表示排列的规模。 第二行是 N 个不同的数字 P i ,表示这 N 个数字的某一排列。 输出格式 输出一个整数,表示不同连号区间的数目。 数据范围 1 ≤ N ≤ 10000 , 1 ≤ P i ≤ N 输入样例1: 4 3 2 4 1 输出样例1: 7 输入样例2: 5 3 4 2 5 1 输出样例2: 9 样例解释 第一个用例中,有 7 7 个连号区间分别是: [ 1 , 1 ] , [ 1 , 2 ] , [ 1 , 3 ] , [ 1 , 4 ] , [ 2 , 2 ] , [ 3 , 3 ] , [ 4 , 4 ] [1,1],[1,2],[1,3],[1,4],[2,2],[3,3],[4,4] 第二个用例中,有 9 9 个连号区间分别是: [ 1 , 1 ] , [ 1 , 2 ] , [ 1

mysql sort 性能优化

谁说胖子不能爱 提交于 2020-01-26 13:57:22
http://dev.mysql.com/doc/refman/5.7/en/order-by-optimization.html 这段时间mysql 数据库的性能明显降低,iowait达到了30, 响应时间明显变长. 通过show processlist 查看,发现有很多session在处理sort 操作, 跟DBA一起调试优化,增大sort_buffer_size 好象效果也不大, 通过查看监控,也没发现有硬盘排序. 我怀疑是sort导致性能下降,固让开发修改程序, sort由程序来处理. 星期五发布后,今天发现压力固然好了很多. 因此基本上能确定是sort引起的问题. 今天仔细分析问题,查看mysql的参数时,看到一个叫做 max_length_for_sort_data 的 参数, 值是1024 仔细查看mysql 的filesort算法时, 发现mysql的filesort有两个方法,MySQL 4.1之前是使用方法A, 之后版本会使用改进的算法B, 但使用方法B的前提是列长度的值小于 max_length_for_sort_data, 但我们系统中的列的长度的值会大于1024. 因此也就是说在sort的时候, 是在使用方法A, 而方法A的性能比较差, 也就解释了我们的mysql系统在有sort时,性能差,去掉之后性能马上提高很多的原因. 马上修改 max_length

MongoDB 聚合管道(Aggregation Pipeline)

人走茶凉 提交于 2020-01-26 01:44:43
MongoDB 聚合管道(Aggregation Pipeline) - 张善友 时间 2013-12-27 22:40:00 博客园_张善友 相似文章 ( 0 ) 原文 http://www.cnblogs.com/shanyou/p/3494854.html 添加到推刊 收藏到推刊 创建推刊 收 藏 取消 已收藏到推刊! 请填写推刊名 描述不能大于100个字符! 权限设置: 公开 仅自己可见 创建 取消 管道概念 POSIX多线程的使用方式中, 有一种很重要的方式-----流水线(亦称为“管道”)方式,“数据元素”流串行地被一组线程按顺序执行。它的使用架构可参考下图: 以面向对象的思想去理解,整个流水线,可以理解为一个数据传输的管道;该管道中的每一个工作线程,可以理解为一个整个流水线的一个工作阶段stage,这些工作线程之间的合作是一环扣一环的。靠输入口越近的工作线程,是时序较早的工作阶段stage,它的工作成果会影响下一个工作线程阶段(stage)的工作结果,即下个阶段依赖于上一个阶段的输出,上一个阶段的输出成为本阶段的输入。这也是pipeline的一个共有特点! 为了回应用户对简单数据访问的需求,MongoDB2.2版本引入新的功能 聚合框架 (Aggregation Framework) ,它是数据聚合的一个新框架,其概念类似于数据处理的管道。

PostgreSQL自定义统计信息

旧巷老猫 提交于 2020-01-25 21:46:43
pg和oracle的优化器一样是基于成本的(CBO)估算。成本估算中很重要的一个环节是估计每个执行节点返回的记录数。例如在hash join中一般都会选择记录较少的作为hash表。 pg中对于单列选择性的估算比较准确,而对于多列的情况则会出现不准确的情况,因为pg默认使用独立属性,直接以多个字段选择性相乘的方法计算多个字段条件的选择性。 pg10开始支持用户自定义统计信息,这样我们便可以针对这种多列的情况创建自定义多个字段的统计信息,目前支持多列相关性和多列唯一值两种统计。 语法: CREATE STATISTICS [ IF NOT EXISTS ] statistics_name [ ( statistics_kind [ , . . . ] ) ] ON column_name , column_name [ , . . . ] FROM table_name 例子: 1、建表 bill = # create table tbl(id int, c1 int, c2 text, c3 int, c4 int, c5 int, c6 int, c7 int, c8 int, c9 int, c10 int); CREATE TABLE 2、插入测试数据 bill = # insert into tbl select bill - # id,random()*100,

直接在 CSS 中引用 FONTAWESOME 图标(附码表)

眉间皱痕 提交于 2020-01-25 10:38:34
直接在 CSS 中引用 FONTAWESOME 图标(附码表) 因此我们如果不想用 Fontawesome 提供的类,只想在 css 里面引用图标的话,可以这样子,请自行脑补: .icon:before { content: '\f006'; font-family: FontAwesome; } 同时附上图标类对应的字符编码表: NAME CODE NAME CODE .fa-glass \f000 .fa-github-alt \f113 .fa-music \f001 .fa-folder-o \f114 .fa-search \f002 .fa-folder-open-o \f115 .fa-envelope-o \f003 .fa-smile-o \f118 .fa-heart \f004 .fa-frown-o \f119 .fa-star \f005 .fa-meh-o \f11a .fa-star-o \f006 .fa-gamepad \f11b .fa-user \f007 .fa-keyboard-o \f11c .fa-film \f008 .fa-flag-o \f11d .fa-th-large \f009 .fa-flag-checkered \f11e .fa-th \f00a .fa-terminal \f120 .fa-th-list \f00b

9种排序方法

こ雲淡風輕ζ 提交于 2020-01-25 08:21:12
#9种常用排序方法如下 #插入排序 Insertion Sort 对未排序数据中进行从后向前的扫描,并找到相应的位置插入 #include<stdio.h> #include<stdio.h> #include<string.h> void insertion_sort(int arr[],int len) { int i,j,temp; for(i=0;i<len;i++) { temp=arr[i]; for(j=i;j>0&&arr[j-1]>temp;j--) { arr[j]=arr[j-1]; } arr[j]=temp; } } int main() { int i,n; while(scanf("%d",&n)!=EOF) { int arr[100]; for(i=0;i<n;i++) { scanf("%d",&arr[i]); } insertion_sort(arr,n); for(i=0;i<n-1;i++) { printf("%d ",arr[i]); } printf("%d\n",arr[n-1]); } return 0; } #希尔排序 Shell Sort (由插入排序改进) 把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。