list排序

Java List/HashSet/HashMap的排序

冷暖自知 提交于 2020-01-31 09:18:39
在对 Java 无序类集合,如List(ArrayList/LinkedList)、HashSet(TreeSet有序)、HashMap等排序时,Java中一个公共的类Collections,提供了对Java集合排序等很好的方法sort。 但是有一个要求是sort方法的参数为<List list> 或<List list, Comparator<? super T> c>,即排序对象要求必须是List类型。 sort 方法的参数必须为List 的原因是,只有List可以定义排序的方法,让List中的元素改变在构建List时原始的相对位置(初始构建时,元素相对位置即为元素初始加入顺序)。HashSet、HashMap 在构建时,初始加入的元素已经按照元素的hashCode()方法的定义排好序。所以这里所说的 HashSet 排序 和 HashMap 排序是指:将其中的元素导出到另一个集合中,对该载体集合排序。排序之后,原HashSet 和 HashMap 中元素顺序没有变。 故而对Java无序类集合的排序问题,基本思路就是:将HashSet 或 HashMap 中的元素取出放入 List 中,对List 用 Collections.sort() 方法排序,之后输出排序后List中的元素,即为对Set/Map 中元素排序后的结果。 注意HashSet、HashMap 中元素位置没有改变

排序算法---快速排序

北慕城南 提交于 2020-01-31 00:15:58
快速排序 快速排序使用 分治法 (Divide and conquer)策略来把一个 序列 (list)分为2个子序列,然后递归地排序两个子序列。 快速排序是一个不稳定的算法,在经过排序之后,可能会对相同值的元素的相对位置造成改变。 快速排序的最坏运行情况是 O(n²),比如说顺序数列的快排。但它的平摊期望时间是 O(nlogn),且 O(nlogn) 记号中隐含的常数因子很小,比复杂度稳定等于 O(nlogn) 的归并排序要小很多。所以,对绝大多数顺序性较弱的随机数列而言,快速排序总是优于归并排序。 快速排序只是使用数组原本的空间进行排序,所以所占用的空间应该是常量级的,但是由于每次划分之后是递归调用,所以递归调用在运行的过程中会消耗一定的空间,在一般情况下的 空间复杂度 为 O(logn) ,在最差的情况下,若每次只完成了一个元素,那么空间复杂度为 O(n) 。所以我们一般认为快速排序的空间复杂度为 O(logn) 。 方法一:遍历交换法。 取一个key元素,我一般取数组的最后一个元素。定义一个指针index从头向后遍历,再定义一个指针位pre于第一个元素之前。如果index元素比key小,pre向前移动一位,交换index和key的元素,把小的放前、大的放后。index遍历到最后,将pre+1和key进行交换,这样比key小的都在它前面,比key大的都在它后面了

Hadoop 排序

血红的双手。 提交于 2020-01-30 14:22:31
  数据排序是许多实际任务在执行时要完成的第一项工作,比如学生成绩评比、数据建立索引等。这个实例和数据去重类似,都是先对原始数据进行初步处理,为进一步的数据操作打好基础。 1.实例描述   对输入文件中的数据进行排序。输入文件中的每行内容均为一个数字,即一个数据。要求在输出中每行有两个间隔的数字,其中,第二个数字代表原始数据,第一个数字这个原始数据在原始数据集中的位次。   样例输入:   file1:   2   32   654   32   15   756   65223   file2:   5956   22   650   92   file3:   26   54   6   样例输出:    2.设计思路   这个实例仅仅要求对输入数据进行排序,熟悉MapReduce过程的读者很快会想到在MapReduce过程中就有排序。是否可以利用这个默认的排序、而不需要自己在实现具体的排序呢?答案是肯定的。但是在使用之前首先要了解MapReduce过程中的默认排序规则。它是按照key值进行排序,如果key为封装int的IntWritable类型,那么MapReduce按照数字大小对key排序;如果key为封装String的Text类型,那么MapReduce按照字典顺序对字符串排序。需要注意的是,Reduce自动排序的数据仅仅是发送到自己所在节点的数据

排序

拟墨画扇 提交于 2020-01-30 02:55:53
一、冒泡排序和插入排序(简单的排序) 冒泡排序原理:依次比较相邻的两个数,将更大的数移到右侧,这样进行一轮,被移到最右边的数肯定是这组数字里最大的。再进行一轮,倒数第二位置放的一定是第二大的数字...以此类推。 时间复杂度分析:顺序 T=O(n) 逆序 JAVA语言: public static void bubbleSort(int[] arr){ //一定要记住判断边界条件 if(arr==null||arr.length<2){ return; } //需要进行arr.length趟比较 for(int i = 0 ;i<arr.length-1;i++){ //第i趟比较 for(int j = 0 ;j<arr.length-i-1;j++){ //开始进行比较,如果arr[j]比arr[j+1]的值大,那就交换位置 if(arr[j]>arr[j+1]){ int temp=arr[j]; arr[j]=arr[j+1]; arr[j+1]=temp; } } } } 插入排序:每一步将一个待排序的数据插入到前面已经排好序的有序序列中,直到插完所有元素为止。 时间复杂度:平均情况:N^2/4 次比较,N^2/4次交换; 最坏情况:N^2/2次比较,N^2/2次交换; 最好情况:N-1次比较,0次交换; 平均时间复杂度: O(N^2) 最好时间复杂度: O(N)

HashMap和TreeMap的常用排序方法

自古美人都是妖i 提交于 2020-01-29 08:50:42
一、简单描述 Map是键值对的集合接口,它的实现类主要包括:HashMap,TreeMap,HashTable以及LinkedHashMap等。 TreeMap:能够把它保存的记录根据键(key)排序,默认是按升序排序,也可以指定排序的比较器,该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法。 HashMap的值是没有顺序的,它是按照key的HashCode来实现的,根据键可以直接获取它的值,具有很快的访问速度。HashMap最多只允许一条记录的键为Null(多条会覆盖);允许多条记录的值为 Null。非同步的。 TreeMap默认是升序的,如果我们需要改变排序方式,则需要使用比较器:Comparator。 Map< Integer, String> map=new TreeMap<>(new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { // return o1.compareTo(o2); //按照key值大小升序排列 -o1.compareTo(o2)即o2.compareTo(o1)按照key值大小降序排列 return -1; //按put反顺序排序 1则为 put顺序排列 } }); map

aslist,gloang线程安全可排序的list

↘锁芯ラ 提交于 2020-01-29 05:23:13
aslist aslist(A Sorted List)是golang语言实现的线程安全可排序的list。便捷的调用方式,使开发者快速入门使用。 前言 近来有喷子喷我,说golang有排序框架何苦要自己造轮子。我只想说中国的拿来主义思想就是导致今天中国为何终始没有自主研发的操作系统,没有自己的芯片。你跟我说这句话就像问"已经有了Java为什么还要学Golang、为什么男人有了老婆还想有小三"。因为需求嘛。各种各样的需求,有人在乎性能,有人在乎便捷,有人在乎二者都在乎。你要是觉得我造的轮子不好,你自己就去造一个更好的。不要在这里说一些显得你很浅薄的话。aslist就是给在乎便捷、不想了解底层算法的人使用。不喜欢你可以走。 为什么要设计aslist? 如果你是从java转golang开发,你就会发现golang中对数组(array)、切片(slice)的封装比较原生。这对开发者来说过去java日常对List方便操作放在golang中是非常痛苦的。如排序(sort)、栈(stack)操作、先进先出(FIFO)、左进右出(LIRI)......本人深耕java多年深刻体会到你的痛苦,所以借鉴java对list体验设计的思路封装了这个轻量级的aslist。使你在golang中能找回java的感觉。 为什么Range、ClearTargets、Pop不能像Java一样使用泛型? 没有办法

剑指offer:合并两个排序的链表

末鹿安然 提交于 2020-01-28 15:35:07
一、题目描述   输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则 二、思路   1.先判断是否是特殊条件     1.1如果两个链表list1、list2都为空,则返回空     1.2如果list1为空则返回list2     1.3如果list2为空则返回list1   2.当两个链表都不为空的时候     将数值小的结点加入链表中   3.当其中一个链表已经遍历完时     直接将剩下的那个链表中的结点依次加入新链表中 三、代码 /* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } }*/ public class Solution { public ListNode Merge(ListNode list1,ListNode list2) { if(list1==null&&list2==null) return null; if(null==list1) return list2; if(null==list2) return list1; ListNode node = new ListNode(-1); ListNode list = node; while(null!=list1&

leetcode 两个排序的中位数 python

房东的猫 提交于 2020-01-28 14:18:16
两个排序数组的中位数 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 。 请找出这两个有序数组的中位数。要求算法的时间复杂度为 O(log (m+n)) 。 你可以假设 nums1 和 nums2 不同时为空。 示例 1: nums1 = [1, 3] nums2 = [2] 中位数是 2.0 示例 2: nums1 = [1, 2] nums2 = [3, 4] 中位数是 (2 + 3)/2 = 2.5 两个列表合并一下排个序, 然后再找中位数   奇数个元素就返回中间元素   偶数个元素返回中间两个的平均数 1 class Solution: 2 def findMedianSortedArrays(self, nums1, nums2): 3 """ 4 :type nums1: List[int] 5 :type nums2: List[int] 6 :rtype: float 7 """ 8 nums = nums1 + nums2 9 nums.sort() 10 l = len(nums) 11 if l % 2 == 0: 12 return (nums[int(l/2)] + nums[int(l/2-1)])/ 2 13 else: 14 return nums[int((l-1)/2)] 来源: https://www.cnblogs

Java TreeMap的排序

允我心安 提交于 2020-01-28 02:32:32
TreeMap 和 HashMap 用法大致相同,但实际需求中,我们需要把一些数据进行排序; 以前在项目中,从数据库查询出来的数据放在List中,顺序都还是对的,但放在HashMap中,顺序就完全乱了。 为了处理排序的问题: 1. 对于一些简单的排序,如:数字,英文字母等 TreeMap hm = new TreeMap<String, String>(new Comparator() { public int compare(Object o1, Object o2) { //如果有空值,直接返回0 if (o1 == null || o2 == null) return 0; return String.valueOf(o1).compareTo(String.valueOf(o2)); } }); 备注: compareTo(String str) :是String 提供的一个方法,如果参数字符串等于此字符串, 则返回 0 值;如果按字典顺序此字符串小于字符串参数,则返回一个小于 0 的值; 如果按字典顺序此字符串大于字符串参数,则返回一个大于 0 的值。 int compare(T o1,T o2):随第一个参数小于、等于或大于第二个参数而分别返回负整数、 零或正整数。 2.对于处理有中文排序的问题 TreeMap hm = new TreeMap<String,

python3内置函数

泪湿孤枕 提交于 2020-01-27 13:16:54
一. 简介   python内置了一系列的常用函数,以便于我们使用,python英文官方文档详细说明: 点击查看 , 为了方便查看,将内置函数的总结记录下来。 二. 使用说明   以下是Python3版本所有的内置函数: 1. abs()  获取绝对值 1 >>> abs(-10) 2 10 3 >>> abs(10) 4 10 5 >>> abs(0) 6 0 7 >>> a = -10 8 >>> a.__abs__() 9 10 2. all()  接受一个迭代器,如果迭代器的所有元素都为真,那么返回True,否则返回False 1 >>> tmp_1 = ['python',123] 2 >>> all(tmp_1) 3 True 4 >>> tmp_2 = [] 5 >>> all(tmp_2) 6 True 7 >>> tmp_3 = [0] 8 >>> all(tmp_3) 9 False 3. any()  接受一个迭代器,如果迭代器里有一个元素为真,那么返回True,否则返回False 4. ascii()  调用对象的__repr__()方法,获得该方法的返回值. 5. bin(), 6. oct(), 7. hex()   三个函数功能为:将十进制数分别转换为2/8/16进制。 8. bool()  测试一个对象是True还是False. 9. bytes()