排序算法

Python高级函数(三)

白昼怎懂夜的黑 提交于 2020-02-21 18:24:42
sorted()函数 排序算法在各种程序中都有广泛的应用,排序的核心就是按照某种规则比较所谓的“大小”,然后交换位置,如果是数字,我们可以直接比较,但如果是字符串或者两个字典呢?直接比较数学上的大小是没有意义的,因此,比较的过程必须通过函数抽象出来。 Python的内置sorted函数就可以对list进行排序。 >> > sorted ( [ 36 , 5 , 15 , - 9 , 12 , 24 ] ) [ - 9 , 5 , 12 , 15 , 24 , 36 ] 此外,sorted()也是一个高阶函数,能够包含一个关键字key使待排序的list能按照key的有关规则进行排序,下面就是一个小例子。 >> > sorted ( [ 36 , - 5 , 4 , 25 , 12 , - 40 ] , key = abs ) [ 4 , - 5 , 12 , 25 , 36 , - 40 ] abs就是对list里的所有数字的绝对值进行排序。 然后就是利用sorted函数对子符串进行排序,默认情况下,对字符串排序,是按照ASCII的大小比较的,由于’Z’ < ‘a’,结果,大写字母Z会排在小写字母a的前面。 现在,我们提出排序应该忽略大小写,按照字母序排序。要实现这个算法,不必对现有代码大加改动,只要我们能用一个key函数把字符串映射为忽略大小写排序即可。忽略大小写来比较两个字符串

[置顶] Effective STL 学习笔记

久未见 提交于 2020-02-21 11:39:33
看Effective STL 作的一些笔记,希望对各位有帮助。 以下是50条条款及相关解释。 容器 1. 慎重选择容器类型,根据需要选择高效的容器类型。 2. 不要试图编写独立于容器类型的代码。 3. 确定容器中的对象拷贝正确而高效。也就是防止在存在继承关系时发生剥离。 4. 调用empty而不是检查size()是否为0来判断容器是否为空。 原因是调用empty比检查size()更加高效。 5. 尽量使用区间成员,而不是多次使用与之对应的单元素成员函数,原因是这样更加高效。 如尽量使用vector的 assign 或 insert 成员函数,而不是一直使用 push_back 。 6. 小心C++编译器最烦人的分析机制 。如 下面的代码中的第二句被C++解释成为了函数声明,这很奇怪但又符合标准。 ifstream dataFile ("ints.dat") list <int> data( istream_iterator<int>(dataFile), istream_iterator<int>() ); // 被解释成为函数声明 正确的写法是这样的,注意第一参数两边的括号: list <int> data( ( istream_iterator<int>(dataFile) ) , istream_iterator<int>() ); 这是因为C+

挑战七大排序算法-07归并排序

我们两清 提交于 2020-02-21 07:06:56
归并排序 1.原理 排序一个数组,先把数组从中间分成前后两个部分,然后对前后两部分分别排序,再将排序好的两部分合并在一起 2.实现 public void mergeSort(int[] array){ mergeSortInternal(array,0,array.length-1); } ​ private void mergeSortInternal(int[] array,int left,int right){ if (left >= right){ return; } int mid = (left+right)/2; mergeSortInternal(array,left,mid); mergeSortInternal(array,mid+1,right); //合并 merge(array,left,mid,right); } ​ private void merge(int[] array,int l,int m,int r){ int i = l; int j = m+1; int k = 0; int[] extra = new int[r-l+1]; while (i <= m && j <= r){ if(array[i] <= array[j]){ extra[k++] = array[i++]; }else{ extra[k++] = array[j

之通用权限(五):项目描述表组(转)

天大地大妈咪最大 提交于 2020-02-21 05:05:28
继续,这是第五章了。我发现了,写文章比写程序还要有难度。另外,大家期待的高人——吉日嘎拉,已经露头了,他在第四章里面留言了,而且留了很多,回复的比较晚,可能有些Tx没有看到,如果您感兴趣可以去看看,如果不感兴趣就算了。 通用权限想要写的文章目录:(这是第五章) 1 、 简介、数据库的总体结构 2 、 介绍人员表组 3 、 介绍组织结构表组 4 、 介绍角色表组 5 、 介绍“项目自我描述表组” 6 、 权限到节点 7 、 权限到按钮 8 、 权限到列表(表单、查询) 9 、 权限的验证 10 、 资源方面的权限 11 、 角色管理的程序(给客户用的) 12 、 权限下放 13 、 个性化设置 项目描述表组 这里的表比较多,主要分为两个部分,一个是“字典信息”,这里就不介绍了,感兴趣的话,请下载数据库说明文档;另一个就是装载配置信息的表。 项目描述,顾名思义就是想要用数据(记录)的形式来描述一个项目,当然不能所有的事情都能用数据的形式描述出来,只有和数据相关的地方才行。最初的目的是给我的几个自定义控件赋值用的,比如表格控件、表单控件、查询控件等,他们都需要很多的信息给他们的属性赋值,如果直接在代码里面写的话,那还不如直接拖拽控件简单呢,所以我就把需要的属性都放在了“表”里面。一开始并没有想到权限,后来才发现,只要修改一下SQL语句,就可以达到“权限”的目的,包括资源权限。同理

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-20 03:00:16
关注“python趣味爱好者”公众号,回复“排序算法”获取源代码 目前,常见的排序算法有: 冒泡排序 插入排序 选择排序 堆排序 计数排序 快速排序 本篇文章将围绕这七大算法进行介绍,我们先来学习一下整体的代码结构: class SORT ( object ) : def __init__ ( self ) : self . arr = [ 20 , 64 , 34 , 25 , 12 , 22 , 11 , 90 ] self . n = len ( self . arr ) self . num = 0 print ( self . arr ) def out_put ( self ) : print ( 50 * '-' ) print ( "最终排序结果" , self . arr ) def bubbleSort ( self ) : #冒泡排序 pass def shellSort ( self ) : #希尔排序 pass def insertionSort ( self ) : #插入排序 pass def Selectionsort ( self ) : #选择排序 pass def heapSort ( self ) : #堆排序 pass def countSort ( self ) : #计数排序 pass def quickSort ( self ) :

javascript 排序和搜索算法

亡梦爱人 提交于 2020-02-19 10:38:30
排序算法 1冒泡排序   学习排序算法时,通常都先学冒泡算法,因为它在所有排序算法中最简单。然而,从运行时间的角度来看,冒泡排序是最差的一个。 冒泡排序比较任何两个相邻的项,如果第一个比第二个大,则交换它们。元素项向上移动至正确的顺序,就好像气泡升至表面一样,冒泡排序因此得名。 function sort(arr){ var len = arr.length; for(var i = 0; i < len;i++){ for(var j = 0;j < len-1;j++){ if(arr[j]>arr[j+1]){ var temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp } } } return arr } 2:选择排序: 选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 function select(arr){ for(var i = 0;i < arr.length-1;i++){ for(var j= i+1;j<arr.length;j++){ if(arr[i]>arr[j]){ var t = arr[i]; arr[i] = arr[j]; arr[j] = t } } }

php经典算法

别说谁变了你拦得住时间么 提交于 2020-02-19 10:36:15
本文实例总结了PHP经典算法。分享给大家供大家参考,具体如下: 1、首先来画个菱形玩玩,很多人学C时在书上都画过,咱们用PHP画下,画了一半。 思路:多少行for一次,然后在里面空格和星号for一次。 <?php for($i=0;$i<=3;$i++){ echo str_repeat(" ",3-$i); echo str_repeat("*",$i*2+1); echo '<br/>'; } 2、冒泡排序,C里基础算法,从小到大对一组数排序。 思路:这题从小到大,第一轮排最小,第二轮排第二小,第三轮排第三小,依次类推…… <?php $arr = array(1,3,5,32,756,2,6); $len = count($arr); for ($i=0;$i<$len-1;$i++){ for ($j=$i+1;$j<$len;$j++){ if($arr[$i]>$arr[$j]){//从小到大 $p = $arr[$i]; $arr[$i] = $arr[$j]; $arr[$j]= $p; } } } var_dump($arr); 3、杨辉三角,用PHP写。 思路:每一行的第一位和最后一位是1,没有变化,中间是前排一位与左边一排的和,这种算法是用一个二维数组保存,另外有种算法用一维数组也可以实现,一行 一行的输出,有兴趣去写着玩下。 1 1 1 1 2 1 1 3

php经典算法

五迷三道 提交于 2020-02-19 10:35:15
php经典算法 1.冒泡算法,排序算法,由于在排序过程中总是小数往前放,大数往后放,相当于气泡往上升,所以称作冒泡排序 $array = array(a,f,c,b,e,h,j,i,g); function maopao_fun($array){ if($len <= 1) { return $arr; } $count = count($array); for($i=0;$i<$count;$i++){ for($j=$count-1;$j>$i;$j--){ if($array[$j] > $array[$j-1]){ $tmp = $array[$j]; $array[$j] = $array[$j-1]; $array[$j-1] = $tmp; } } } return $array; } 2.快速排序  快速排序(Quicksort)是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 function quickSort($arr){ $len = count($arr); if($len <= 1) { return $arr; }

归并排序指针版及链表版

ε祈祈猫儿з 提交于 2020-02-19 05:40:22
什么是归并排序    归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。   归并排序比较占用内存,但却是一种 效率高且稳定 的算法。其时间复杂度为 O(n log n) ,空间复杂度为 T(n)。其速度仅次于快速排序,为稳定排序算法,一般用于对总体无序,但是各子项相对有序的数列。   个人觉得一般归并排序用于链表的排序有奇效! 思路   归并排序的主要思想是 分治 。   主要过程是: 1.将n个元素从中间切开,分成两部分。(左边可能比右边多1个数) 2.将步骤1分成的两部分,再分别进行递归分解。直到所有部分的元素个数都为1。 3.从最底层开始逐步合并两个排好序的数列为一个有序的数列。 图片取自https://www.cnblog.com/chengxiao/p/6194356.html 指针版: # include <stdio.h> # include <string.h> # include <stdlib.h> void sort ( int x , int y , int * st ) ; //将数组分开 void Link ( int x