常见的排序算法(直接插入&选择排序&二分查找排序)

1、直接插入排序算法源码:packagecom.DiYiZhang;/*插入排序算法 *如下进行的是插入,排序算法*/publicclassInsertionSort{   publicstaticvoidinsertionSort(int[]a){       inttmp;       for(inti=1;i<a.length;i++){           for(intj=i;j>0;j--){               if(a[j]<a[j-1]){      ...

关于python内存管理里的引用计数算法和标记-清楚算法的讨论

先记录于此,后续有时间再深究吧:1、https://www.zhihu.com/question/335294432、http://patshaughnessy.net/2013/10/30/generational-gc-in-python-and-ruby3、http://python.jobbole.com/85431/4、http://www.cnblogs.com/vamei/p/3232088.html5、http://www.cnblogs.com/xybaby/p/7491656.html...

算法:支持重复元素的二分查找

近几天在处理的一个项目,需要频繁对一些有序超大集合进行目标查找,二分查找算法是这类问题的最优解。但是java的Arrays.binarySearch()方法,如果集合中有重复元素,而且遇到目标元素正好是这些重复元素之一,该方法只能返回一个,并不能将所有的重复目标元素都返回,没办法,只能自造轮子了。先复习下二分查找的经典算法:1privateintbinarySearch1(Integer[]A,Integerx){2intlow=0,high=A.length-1;3while(low<=high){4intmid=(low+high)/2;5if(A[mid].equals(x)){6returnmid;7}elseif(x<A[mid]){8high=mid-1;9}else{10low=mid+1;11}12}13return-1;14}思路很简单,先定位到中间元素,如果中间元素比目标元素大,则扔掉后一半,反之扔掉前一半,如果正好一次命中,直接返回。略做改进:1privateList<Integer>binarySearch2(Integer[]A,Int...

Spring Security笔记:使用BCrypt算法加密存储登录密码

在前一节使用数据库进行用户认证(formloginusingdatabase)里,我们学习了如何把“登录帐号、密码”存储在db中,但是密码都是明文存储的,显然不太讲究。这一节将学习如何使用springsecurity3新加入的bcrypt算法,将登录加密存储到db中,并正常通过验证。一、Bcrypt算法1intt=0;2Stringpassword="123456";3System.out.println(password+"->");4for(t=1;t<=10;t++){5BCryptPasswordEncoderpasswordEncoder=newBCryptPasswordEncoder();6StringhashedPassword=passwordEncoder.encode(password);7System.out.println(hashedPassword);8}910password="MIKE123";11System.out.println(password+"->");12for(t=1;t<=10;t++)...

asp中的md5/sha1/sha256算法收集

对于asp这种古董级的技术,这年头想找一些有用的资料已经不容易了,下面是一些常用的加密算法:md5(将以下代码另存为md5.inc)<%PrivateConstBITS_TO_A_BYTE=8PrivateConstBYTES_TO_A_WORD=4PrivateConstBITS_TO_A_WORD=32Privatem_lOnBits(30)Privatem_l2Power(30)PrivateFunctionLShift(lValue,iShiftBits)IfiShiftBits=0ThenLShift=lValueExitFunctionElseIfiShiftBits=31ThenIflValueAnd1ThenLShift=&H80000000ElseLShift=0EndIfExitFunctionElseIfiShiftBits<0OriShiftBits>31ThenErr.Raise6EndIfIf(lValueAndm_l2Power(31-iShiftBits))ThenLShift=((lValueAndm_lOnBits(31-(...

Linux IO调度器相关算法介绍(转)

IO调度器(IOScheduler)是操作系统用来决定块设备上IO操作提交顺序的方法。存在的目的有两个,一是提高IO吞吐量,二是降低IO响应时间。然而IO吞吐量和IO响应时间往往是矛盾的,为了尽量平衡这两者,IO调度器提供了多种调度算法来适应不同的IO请求场景。其中,对数据库这种随机读写的场景最有利的算法是DEANLINE。接着我们按照从简单到复杂的顺序,迅速扫一下Linux2.6内核提供的几种IO调度算法。1、NOOPNOOP算法的全写为NoOperation。该算法实现了最最简单的FIFO队列,所有IO请求大致按照先来后到的顺序进行操作。之所以说“大致”,原因是NOOP在FIFO的基础上还做了相邻IO请求的合并,并不是完完全全按照先进先出的规则满足IO请求。假设有如下的io请求序列:100,500,101,10,56,1000NOOP将会按照如下顺序满足:100(101),500,10,56,10002、CFQCFQ算法的全写为CompletelyFairQueuing。该算法的特点是按照IO请求的地址进行排序,而不是按照先来后到的顺序来进行响应。假设有如下...

算法的上帝——Donald E.Knuth(转)

开始介绍前先膜拜之~密尔沃基市,是美国威斯康辛州最大的城市。1938年1月10日,圣诞刚过不久,密尔沃基市民像往常一样平静地生活着。咖啡店里,有人在议论着罗斯福总统的救市新政策,有人在议论着到底该不该限制公民持枪。而更多的人呢,则一边品尝着密尔沃基闻名全国的啤酒,一边听着广播里面的实时战况:侵华日军登陆青岛了。谁也没有想到,这个平静的日子将载入这座城市的史册。这天,密尔沃基路德教会高中的一名印刷管理员,高兴地迎来了一个健康的儿子。他为儿子取了一个响亮的名字,这个名字在不久的将来,成为了计算机编程艺术的旗帜:DonaldErvinKnuth。为了方便讲述,请各位读者允许我先剧透一件39年后的事儿。在1977年Knuth造访中国前夕,姚期智的夫人为他取了一个中文名字:高德纳。在下面的故事里,我们就使用这个名字来称呼他。高德纳天资聪颖,他的超凡智力在8岁时就显示出来了。当时,一家糖果商在孩子们当中举办了一项有趣的比赛,要求用“Ziegler’sGiantBar”里面的字母,写出尽可能多的单词。裁判事先准备了一份2500个单词的列表,可他却远远低估了小选手的...
代码星球 代码星球·2020-04-06

JVM GC算法 CMS 详解(转)

CMS,全称ConcurrentLowPauseCollector,是jdk1.4后期版本开始引入的新gc算法,在jdk5和jdk6中得到了进一步改进,它的主要适合场景是对响应时间的重要性需求大于对吞吐量的要求,能够承受垃圾回收线程和应用线程共享处理器资源,并且应用中存在比较多的长生命周期的对象的应用。CMS是用于对tenuredgeneration的回收,也就是年老代的回收,目标是尽量减少应用的暂停时间,减少fullgc发生的几率,利用和应用程序线程并发的垃圾回收线程来标记清除年老代。在我们的应用中,因为有缓存的存在,并且对于响应时间也有比较高的要求,因此希望能尝试使用CMS来替代默认的server型JVM使用的并行收集器,以便获得更短的垃圾回收的暂停时间,提高程序的响应性。 CMS并非没有暂停,而是用两次短暂停来替代串行标记整理算法的长暂停,它的收集周期是这样:初始标记(CMS-initial-mark)->并发标记(CMS-concurrent-mark)->重新标记(CMS-remark)->并发清除(CMS-concurrent-sweep)-&g...
代码星球 代码星球·2020-04-06

遗传算法实现自动组卷、随机抽题 (转)

using System;using System.Windows.Forms;using System.IO;namespace GA{    public partial class Form1 : Form    {        TTm[] TP;        int _ts = 0;        int n = 10;        int m = 12;   &...

算法8-排序-基数排序

基数排序与本系列前面讲解的七种排序方法都不同,它不需要比较关键字的大小。它是根据关键字中各位的值,通过对排序的N个元素进行若干趟“分配”与“收集”来实现排序的。  不妨通过一个具体的实例来展示一下,基数排序是如何进行的。 设有一个初始序列为:R{50,123,543,187,49,30,0,2,11,100}。我们知道,任何一个阿拉伯数,它的各个位数上的基数都是以0~9来表示的。所以我们不妨把0~9视为10个桶。 我们先根据序列的个位数的数字来进行分类,将其分到指定的桶中。例如:R[0]=50,个位数上是0,将这个数存入编号为0的桶中。 分类后,我们在从各个桶中,将这些数按照从编号0到编号9的顺序依次将所有数取出来。这时,得到的序列就是个位数上呈递增趋势的序列。 按照个位数排序: {50,30,0,100,11,2,123,543,187,49}。接下来,可以对十位数、百位数也按照这种方法进行排序,最后就能得到排序完成的序列。 (1)LSD法实现实现代码&nb...

算法7-排序-归并排序

将待排序序列R[0...n-1]看成是n个长度为1的有序序列,将相邻的有序表成对归并,得到n/2个长度为2的有序表;将这些有序序列再次归并,得到n/4个长度为4的有序序列;如此反复进行下去,最后得到一个长度为n的有序序列。综上可知:归并排序其实要做两件事:(1)“分解”——将序列每次折半划分。(2)“合并”——将划分后的序列段两两合并后排序。 我们先来考虑第二步,如何合并?在每次合并过程中,都是对两个有序的序列段进行合并,然后排序。这两个有序序列段分别为 R[low,mid] 和 R[mid+1,high]。先将他们合并到一个局部的暂存数组R2中,带合并完成后再将R2复制回R中。为了方便描述,我们称 R[low,mid] 第一段,R[mid+1,high] 为第二段。每次从两个段中取出一个记录进行关键字的比较,将较小者放入R2中。最后将各段中余下的部分直接复制到R2中。经过这样的过程,R2已经是一个有序的序列,再将其复制回...

算法6-排序-快速排序

(1)基本思想:选择一个基准元素,通常选择第一个元素或者最后一个元素,通过一趟扫描,将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素,此时基准元素在其排好序后的正确位置,然后再用同样的方法递归地排序划分的两部分。(2)实例:(3)java实现publicclassquickSort{inta[]={49,38,65,97,76,13,27,49,78,34,12,64,5,4,62,99,98,54,56,17,18,23,34,15,35,25,53,51};publicquickSort(){quick(a);for(inti=0;i<a.length;i++)System.out.println(a[i]);}publicintgetMiddle(int[]list,intlow,inthigh){inttmp=list[low];//数组的第一个作为中轴while(low<high){while(low<high&&list[high]>=tmp){high--;}list[low]=list[high];//比中轴小的记...

算法5-排序-冒泡排序

(1)基本思想:在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序排序要求相反时,就将它们互换。(2)实例:3)用java实现publicclassbubbleSort{publicbubbleSort(){inta[]={49,38,65,97,76,13,27,49,78,34,12,64,5,4,62,99,98,54,56,17,18,23,34,15,35,25,53,51};inttemp=0;for(inti=0;i<a.length-1;i++){for(intj=0;j<a.length-1-i;j++){if(a[j]>a[j+1]){temp=a[j];a[j]=a[j+1];a[j+1]=temp;}}}for(inti=0;i<a.length;i++)System.out.println(a[i]);}}  ...

算法4-排序-堆排序

在介绍堆排序之前,首先需要说明一下,堆是个什么玩意儿。堆是一棵顺序存储的完全二叉树。其中每个结点的关键字都不大于其孩子结点的关键字,这样的堆称为小根堆。其中每个结点的关键字都不小于其孩子结点的关键字,这样的堆称为大根堆。举例来说,对于n个元素的序列{R0, R1,..., Rn}当且仅当满足下列关系之一时,称之为堆:(1)Ri <=R2i+1 且 Ri <=R2i+2 (小根堆)(2)Ri >=R2i+1 且 Ri >=R2i+2 (大根堆)其中i=1,2,…,n/2向下取整;  如上图所示,序列R{3,8,15,31,25}是一个典型的小根堆。堆中有两个父结点,元素3和元素8。元素3在数组中以R[0]表示,它的左孩子结点是R[1],右孩子结点是R[2]。元素8在数组中以R[1]表示,它的左孩子结点是R[3],右孩子结点是R[4],它的父结点是R[0]。可以看出,它们满足以下规律:设当前元素在数组中以R[i]表...
代码星球 代码星球·2020-04-06

算法3-排序-简单选择排序

基本思想:在要排序的一组数中,选出最小的一个数与第一个位置的数交换;然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。选择排序的思想其实和冒泡排序有点类似,都是在一次排序后把最小的元素放到最前面。但是过程不同,冒泡排序是通过相邻的比较和交换。而选择排序是通过对整体的选择。举个栗子,对5,3,8,6,4这个无序序列进行简单选择排序,首先要选择5以外的最小数来和5交换,也就是选择3和5交换,一次排序后就变成了3,5,8,6,4.对剩下的序列一次进行选择和交换,最终就会得到一个有序序列。其实选择排序可以看成冒泡排序的优化,因为其目的相同,只是选择排序只有在确定了最小数的前提下才进行交换,大大减少了交换的次数。选择排序的时间复杂度为O(n^2)publicclassselectSort{publicselectSort(){inta[]={1,54,6,3,78,34,12,45};intposition=0;for(inti=0;i<a.length;i++){intj=i+1;position=i;inttemp=a[i];for(;j&l...
首页上一页...112113114115116...下一页尾页