sort函数

十大经典算法排序总结对比

ぐ巨炮叔叔 提交于 2020-02-28 13:31:56
十大经典算法排序总结对比 一张图概括: 主流排序算法概览 名词解释: n : 数据规模 k :“桶”的个数 In-place : 占用常数内存,不占用额外内存 Out-place : 占用额外内存 稳定性 :排序后2个相等键值的顺序和排序之前它们的顺序相同 冒泡排序(Bubble Sort) 冒泡排序须知: 作为最简单的排序算法之一,冒泡排序给我的感觉就像Abandon在单词书里出现的感觉一样,每次都在第一页第一位,所以最熟悉。。。冒泡排序还有一种优化算法,就是立一个flag,当在一趟序列遍历中元素没有发生交换,则证明该序列已经有序。但这种改进对于提升性能来说并没有什么太大作用。。。 什么时候最快(Best Cases): 当输入的数据已经是正序时(都已经是正序了,我还要你冒泡排序有何用啊。。。。) 什么时候最慢(Worst Cases): 当输入的数据是反序时(写一个for循环反序输出数据不就行了,干嘛要用你冒泡排序呢,我是闲的吗。。。) 冒泡排序动图演示: 冒泡排序JavaScript代码实现: function bubbleSort(arr) { var len = arr.length; for (var i = 0; i < len; i++) { for (var j = 0; j < len - 1 - i; j++) { if (arr[j] > arr[j+1])

按多个属性对列表进行排序?

◇◆丶佛笑我妖孽 提交于 2020-02-27 03:43:45
我有一个清单清单: [[12, 'tall', 'blue', 1], [2, 'short', 'red', 9], [4, 'tall', 'blue', 13]] 如果我想按一个元素(例如,高/短元素)进行排序,则可以通过 s = sorted(s, key = itemgetter(1)) 。 如果我想用 又 高/短,颜色排序,我可以为每个元素做排序两次,一次,但有一个更快的方法? #1楼 我不确定这是否是最pythonic的方法...我有一个元组列表,需要按降序对整数值进行排序,然后按字母顺序对第二个进行排序。 这需要反转整数排序,而不是字母排序。 这是我的解决方案:(在一次考试中,我什至不知道您可以“嵌套”排序功能) a = [('Al', 2),('Bill', 1),('Carol', 2), ('Abel', 3), ('Zeke', 2), ('Chris', 1)] b = sorted(sorted(a, key = lambda x : x[0]), key = lambda x : x[1], reverse = True) print(b) [('Abel', 3), ('Al', 2), ('Carol', 2), ('Zeke', 2), ('Bill', 1), ('Chris', 1)] #2楼 键可以是返回元组的函数: s = sorted

Python性能优化的20条建议

会有一股神秘感。 提交于 2020-02-26 10:33:59
优化算法时间复杂度 算法的时间复杂度对程序的执行效率影响最大,在Python中可以通过选择合适的数据结构来优化时间复杂度,如list和set查找某一个元素的时间复杂度分别是O(n)和O(1)。不同的场景有不同的优化方式,总得来说,一般有分治,分支界限,贪心,动态规划等思想。 减少冗余数据 如用上三角或下三角的方式去保存一个大的对称矩阵。在0元素占大多数的矩阵里使用稀疏矩阵表示。 合理使用copy与deepcopy 对于dict和list等数据结构的对象,直接赋值使用的是引用的方式。而有些情况下需要复制整个对象,这时可以使用copy包里的copy和deepcopy,这两个函数的不同之处在于后者是递归复制的。效率也不一样:(以下程序在ipython中运行) import copy a = range(100000) %timeit -n 10 copy.copy(a) # 运行10次 copy.copy(a) %timeit -n 10 copy.deepcopy(a) 10 loops, best of 3: 1.55 ms per loop 10 loops, best of 3: 151 ms per loop timeit后面的-n表示运行的次数,后两行对应的是两个timeit的输出,下同。由此可见后者慢一个数量级。 使用dict或set查找元素 python

C++学习笔记NO.8——好用的sort

喜夏-厌秋 提交于 2020-02-23 20:36:24
文章目录 应包含的头文件 样例(从小到大排) 样例(从大到小排) 注意事项 第二个参数(指针)应该是最后一个元素地址的下一个地址 第三个参数(函数)不要起名为max 由此导致的报错 应包含的头文件 # include <algorithm> 样例(从小到大排) # include <iostream> # include <algorithm> using namespace std ; int main ( ) { int nums [ 5 ] ; for ( int i = 0 ; i < 4 ; ++ i ) { cin >> nums [ i ] ; } sort ( nums , nums + 4 ) ; for ( int i = 0 ; i < 4 ; ++ i ) { cout << nums [ i ] ; } return 0 ; } 样例(从大到小排) # include <iostream> # include <algorithm> using namespace std ; bool cba ( int a , int b ) { return a > b ; } int main ( ) { int nums [ 5 ] ; for ( int i = 0 ; i < 4 ; ++ i ) { cin >> nums [ i ] ; } sort (

partial_sort

怎甘沉沦 提交于 2020-02-20 13:44:35
参考http://c.biancheng.net/view/564.html 1.用法 通过示例很容易理解什么是部分排序。假设有一个容器,它保存了 100 万个数值,但我们只对其中最小的 100 个感兴趣。可以对容器的全部内容排序,然后选择前 100 个元素,但这可能有点消耗时间。这时候需要使用部分排序,只需要这些数中的前100个是有序放置的。 对于部分排序,有一个特殊的算法 partial_sort(),它需要 3 个随机访问迭代器作为参数。如果这个函数的参数是 first、second 和 last,那么这个算法会被应用到 [first,last) 这个范围内的元素上。执行这个算法后,[first,second) 会包含降序序列 [first,last) 中最小的 second-first 个元素。 ` 注意,在这个示例中,有一种之前没遇到过的表示方式 [first,last),用它来表示一个元素段,这是一个来自于数学领域的用来定义数字范围的概念——区间。这两个值叫作结束点,在这种表示法中,方括号表示包含相邻的结束点,圆括号表示相邻的结束点不包括在内。 例如,如果 (2,5) 是一个整数区间,2 和 5 都被排除在外,所以它只表示整数 3 和 4;这也被叫作开区间,因为两个结束点都不包含。区间 [2,5) 包含 2 但不包含 5,所以它表示 2、3 和 4。(2,5] 表示 3

python常用排序算法

空扰寡人 提交于 2020-02-16 22:55:41
常见排序算法 算法:一个计算过程,解决问题的方法 程序 = 数据结构 + 算法 1.算法基本概念 1.时间复杂度 用什么方式来体现算法运行的快慢? 通过运行的次数表示时间复杂度 示例: print("hello world") print("hello python") print("hello algorithm") #以上时间复杂度O(1) for i in range(n): print("hello world") for j in range(n): print("hello world") #时间复杂度O(n**2) while n>1: print(n) n = n//2 时间复杂度记为O(log 2 n)或O(log n) 当算法过程出现循环折半的时候复杂度式子中会出现log n 时间复杂度小结 时间复杂度是用来计算算法运行的时间的一个式子(单位) 一般来说,时间复杂度高的算法比复杂度低的算法慢。 创建的时间复杂度(按效率排序) O(1) < O(logn) < O(nlogn) < O(n2) < O(n2 log n) < O(n3) 复杂问题的时间复杂度 O(n!) O(2**n) O(n**n) 如何简单快速地判断算法复杂度 快速判断算法复杂度,适用于绝大多数简单情况 确定问题规模n 循环减半过程---> log n k层关于n的循环 --->n**k

LeetCode 75. Sort Colors

房东的猫 提交于 2020-02-14 21:18:10
75. Sort Colors(颜色分类) 链接 https://leetcode-cn.com/problems/sort-colors 题目 给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。 此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。 注意: 不能使用代码库中的排序函数来解决这道题。 示例: 输入: [2,0,2,1,1,0] 输出: [0,0,1,1,2,2] 进阶: 一个直观的解决方案是使用计数排序的两趟扫描算法。 首先,迭代计算出0、1 和 2 元素的个数,然后按照0、1、2的排序,重写当前数组。 你能想出一个仅使用常数空间的一趟扫描算法吗? 思路 一道数组题目,解法多种。 说不让用代码库中的排序函数,那自己写一个应该不算违规吧23333. 只有三种数字,012,那么可以遍历统计每个数字的数量,之后直接更改。 也可以用三指针法,index012,一共三个变量,index0和1初始值是0,index2初始值是nums.length-1.遍历使用index1,发现那个数字为0,就和index0的数交换,为2就和index2的数交换,这里要注意,index2换过来的数还需要再判断一下。 代码 public static void swap(int[] nums, int i

Eigen 简明教程

∥☆過路亽.° 提交于 2020-02-14 13:34:10
Eigen Quick Reference 一个 Eigen 的参考手册,包含 Python(Numpy) 与 Eigen 的对应用法,以及一些练习题。持续更新中。 Eigen array, matrix and vector types 在 Eigen 中,Matrix 用来表示数学意义上的矩阵和向量,Array 用来表示 1D 和 2D 的数组,你可以这样定义它们: typedef Matrix<Scalar, RowsAtCompileTime, ColsAtCompileTime, Options> MyMatrixType; typedef Array<Scalar, RowsAtCompileTime, ColsAtCompileTime, Options> MyArrayType; Scalar 表示系数的类型(例如float, double, boll, int 等等)。 RowsAtCompileTime 和 ColsAtCompileTime 表示矩阵行数和列数(必须在编译时期给定),或者使用 Dynamic 表示其行数或者列数在运行时期给定。 Options 可以是 ColMajor 或者 RowMajor ,它们表示存储数据的顺序,默认是 ColMajor 。( 这里 有存储顺序的更多介绍) 你可以随意的组合上面的参数来创建 Matrix,例如 Matrix

【数据挖掘重要笔记day10】numpy练手题+归并排序法+插入排序法+希尔排序法+快速排序法+冒泡排序法

早过忘川 提交于 2020-02-13 02:08:38
文章目录 1、创建一个长度为10的一维全为0的ndarray对象,然后让第5个元素等于1 2、创建一个元素为从10到49的ndarray对象 3、将第2题的所有元素位置反转 4、使用np.random.random创建一个10*10的ndarray对象,并打印出最大最小元素 5、创建一个10*10的ndarray对象,且矩阵边界全为1,里面全为0 6、创建一个每一行都是从0到4的5*5矩阵 7、创建一个范围在(0,1)之间的长度为12的等差数列 8、创建一个长度为10的随机数组并排序 9、创建一个长度为10的随机数组并将最大值替换为0 10、如何根据第3列来对一个5*5矩阵排序? 11、给定一个4维矩阵,如何得到最后两维的和? 12、给定数组[1, 2, 3, 4, 5],如何得到在这个数组的每个元素之间插入3个0后的新数组? 13、给定一个二维矩阵,如何交换其中两行的元素? 14、创建一个100000长度的随机数组,使用两种方法对其求三次方,并比较所用时间 15、创建一个5 * 3随机矩阵和一个3*2随机矩阵,求矩阵积 16、矩阵的每一行的元素都减去该行的平均值 17、打印出以下函数(要求使用np.zeros创建8*8的矩阵): 18、正则化一个5*5随机矩阵,正则的概念:假设a是矩阵中的一个元素,max/min分别是矩阵元素的最大最小值,则正则化后a = (a - min)/

十大排序算法

a 夏天 提交于 2020-02-13 02:02:07
好好学习算法基础 0、排序算法说明 0.1 排序的定义 对一序列对象根据某个关键字进行排序。 0.2 术语说明 稳定 :如果a原本在b前面,而a=b,排序之后a仍然在b的前面; 不稳定 :如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面; 内排序 :所有排序操作都在内存中完成; 外排序 :由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行; 时间复杂度: 一个算法执行所耗费的时间。 空间复杂度 :运行完一个程序所需内存的大小。 0.3 算法总结 图片名词解释: n: 数据规模 k: “桶”的个数 In-place: 占用常数内存,不占用额外内存 Out-place: 占用额外内存 0.5 算法分类 0.6 比较和非比较的区别 常见的 快速排序、归并排序、堆排序、冒泡排序 等属于 比较排序 。 在排序的最终结果里,元素之间的次序依赖于它们之间的比较。每个数都必须和其他数进行比较,才能确定自己的位置。 在 冒泡排序 之类的排序中,问题规模为n,又因为需要比较n次,所以平均时间复杂度为O(n²)。在 归并排序、快速排序 之类的排序中,问题规模通过 分治法 消减为logN次,所以时间复杂度平均 O(nlogn) 。 比较排序的优势是,适用于各种规模的数据,也不在乎数据的分布,都能进行排序。可以说, 比较排序适用于一切需要排序的情况。 计数排序、基数排序