算法笔记_014:合并排序(Java)

给定一组数据,使用合并排序得到这组数据的非降序排列。  引用自百度百科:合并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(DivideandConquer)的一个非常典型的应用。合并排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。合并排序也叫归并排序。     下面看一下具体排序示例: 排序性能分析:  packagecom.liuzhen.chapterFive;publicclassMergesort{//使用合并排序,获取数组A的非降序排列publicstaticvoidgetMergesort(int[]A){intlenA=A.length;//数组A的长度if(lenA>1){int[]B=copyArray(A,0);//获...

算法笔记_015:快速排序Java

/1问题描述2解决方案2.1快速排序原理简介2.2具体编码 给定一组数据,使用快速排序得到这组数据的非降序排列。  引用自百度百科:快速排序(Quicksort)是对冒泡排序的一种改进。快速排序由C.A.R.Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 具体排序过程:设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。 一趟快速排序算法是:1)设置两个变量i、j,排序开始的时候:i=0,j=N-1(PS:即i从数组前开始向后遍历,j从数组后开始向前遍历);2)以第一个数组...

算法笔记_023:拓扑排序Java

/目录1问题描述2解决方案2.1基于减治法实现2.2基于深度优先查找实现给定一个有向图,求取此图的拓扑排序序列。那么,何为拓扑排序?定义:将有向图中的顶点以线性方式进行排序。即对于任何连接自顶点u到顶点v的有向边uv,在最后的排序结果中,顶点u总是在顶点v的前面。  实现原理:不断地做这样一件事,在余下的有向图中求取一个源(source)(PS:定义入度为0的顶点为有向图的源),它是一个没有输入边的顶点,然后把它和所有从它出发的边都删除。(如果有多个这样的源,可以任意选择一个。如果这样的源不存在,算法停止,此时该问题无解),下面给出《算法设计与分析基础》第三版上一个配图:  具体代码如下:packagecom.liuzhen.chapterFour;importjava.util.Stack;publicclassTopologicalSorting{//方法1:基于减治法:寻找图中入度为0的顶点作为即将遍历的顶点,遍历完后,将此顶点从图中删除/**参数adjMatrix:给出图的邻接矩阵值*参数source:给出图的每个顶点的入度值*该函数功能...

算法笔记_036:预排序Java

/目录1问题描述2解决方案2.1检验数组中元素的唯一性2.2模式计算在计算机科学中,预排序是一种很古老的思想。实际上,对于排序算法的兴趣很大程度上是因为这样一个事实:如果列表是有序的,许多关于列表的问题更容易求解。显然,对于包含了排序操作,这种算法的时间效率依赖于所选用的排序算法的效率。对于预排序的具体思想应用请参考下文。  此问题,首先使用合并排序对数组中元素进行一次从小到大的排序,然后,依次检查数组中的元素,看是否有重复元素,如果有这说明该元素不具有唯一性,否则说明该数组中的所有元素具有元素的唯一性。具体代码如下:packagecom.liuzhen.chapter6;publicclassPresortElementUniqueness{//归并排序publicvoidmergeSort(int[]A){if(A.length>1){int[]leftA=getHalfArray(A,0);//数组A的左半部分int[]rightA=getHalfArray(A,1);//数组A的右半部分mergeSort(leftA);mergeSort(rightA...
代码星球 代码星球·2021-02-09

算法笔记_049:奇偶数排序Java

/目录1问题描述2解决方案2.1一头一尾指针往中间扫描法2.2一前一后两个指针同时往后扫描法给定一个整数数组,请调整数组中数的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。要求时间复杂度为O(n)。具体代码如下:packagecom.liuzhen.array_2;publicclassOddEvenSort{//解法1:一头一尾指针往中间扫描publicvoidgetOddEvenSort1(int[]A){if(A.length==1)return;intbegin=0;intend=A.length-1;while(begin<end){if(A[begin]%2==1)//当A[begin]为奇数时begin++;elseif(A[end]%2==0)//当A[end]为偶数时end--;else//当A[begin]不是奇数且A[end]不是偶数时swap(A,begin,end);}}//交换数组A的m位置和n位置上的值publicvoidswap(int[]A,intm,intn){inttemp=A[m];A[m]=A[n];A[n]=temp...

算法笔记_100:蓝桥杯练习 算法提高 三个整数的排序Java

/目录1问题描述2解决方案问题描述  输入三个数,比较其大小,并从大到小输出。输入格式  一行三个整数。输出格式  一行三个整数,从大到小排序。样例输入338877样例输出887733  具体代码如下:importjava.util.Scanner;publicclassMain{publicvoidswap(int[]A,inta,intb){inttemp=A[a];A[a]=A[b];A[b]=temp;}publicvoidselectSort(int[]A){intmax;for(inti=0;i<A.length;i++){max=i;for(intj=i+1;j<A.length;j++){if(A[max]<A[j])max=j;}swap(A,i,max);}}publicstaticvoidmain(String[]args){Maintest=newMain();Scannerin=newScanner(System.in);int[]A=newint[3];for(inti=0;i<3;i++)A[i]=in.next...

算法笔记_129:计数排序(Java)

/目录1问题描述2解决方案2.1比较计数排序2.2分布计数排序给定一组数据,请使用计数排序,得到这组数据从小到大的排序序列。  下面算法的时间复杂度为O(n^2),空间复杂度为O(n)。此方法对于任意一组数据均可排序。具体代码如下:packagecom.liuzhen.practice;publicclassMain{publicvoidcomparisonCountingSort(int[]A){int[]temp=newint[A.length];int[]count=newint[A.length];for(inti=0;i<A.length-1;i++){for(intj=i+1;j<A.length;j++){if(A[i]<A[j])count[j]++;elsecount[i]++;}}for(inti=0;i<A.length;i++)temp[count[i]]=A[i];for(inti=0;i<A.length;i++)A[i]=temp[i];return;}publicstaticvoidmain(String...

算法笔记_145:拓扑排序的应用(Java)

/目录1问题描述2解决方案给出一些球,从1~N编号,他们的重量都不相同,也用1~N标记加以区分(这里真心恶毒啊,估计很多WA都是因为这里),然后给出一些约束条件,<a,b>要求编号为a的球必须比b轻,现在要求按编号升序输出每个球的重量,如果有多种解,输出字典序最小的那个。例如:input:15451421323output:24531具体代码如下: packagecom.liuzhen.practice;importjava.util.ArrayList;importjava.util.Scanner;publicclassMain{publicstaticintcount;//顶点的编号publicstaticint[]degree;//计算顶点的入度publicstaticArrayList<edge>[]map;//表示图publicstaticArrayList<String>result1=newArrayList<String>();staticclassedge{publicinta;//边的起点publicint...

LeetCode刷题总结-排序、并查集和图篇

本文介绍LeetCode上有关排序、并查集和图的算法题,推荐刷题总数为15道。具体考点分析如下图:     1.数组问题题号:164.最大间距,难度困难题号:324.摆动排序II,难度中等 2.数学问题题号:179.最大数,难度中等 3.实际场景应用问题题号:853.车队,难度中等题号:1235.规划兼职工作,难度困难  1.数组问题题号:130.被围绕的区域,难度中等题号:803.打砖块,难度困难题号:924.尽量减少恶意软件的传播,难度困难 2.数学问题题号:399.除法求值,难度中等题号:952.按公因数计算最大组件大小,难度困难  1.实际场景应用问题题号:207.课程表,难度中等题号:332.重新安排行程,难度中等题号:1203.项目管理,难度困难 2.结合树的问题题号:310.最小高度树,难度中等 3.数学问题题号:996.正方形数组的数目,难度困难   ...

C语言的经典排序算法源码

1、插入排序:插入法是一种比较直观的排序方法。它首先把数组头两个元素排好序,再依次把后面的元素插入适当的位置。把数组元素插完也就完成了排序。代码如下:#include<stdio.h>voidmain(){inta[10];inti,j,k;printf("请输入10个数字!空格隔开");for(i=0;i<10;i++)scanf("%d",&a[i]);for(i=1;i<10;i++){k=a[i];j=i-1;while((j>=0)&&(a[j]>k)){a[j+1]=a[j];j--;}a[j+1]=k;}printf("你输入的数字按照插入排序法由小到大排序后为");for(i=0;i<10;i++)printf("%d",a[i]);printf("");}2、快速排序:快速法定义了三个参数,(数组首地址*a,要排序数组起始元素下标i,要排序数组结束元素下标j). 它首先选一个数组元素(一般为a[(i+j)/2],即中间元素)作为参照,把比它小的元素放到它的左边,比它大的放在右边。然后运用递归,...

es6 class的基础语法,es6 class继承/ es5 call继承描述/使用es6完美继承Array的方法 sort倒序排序console.table()表格生成

//基础语法functionPeople(name,email){name,email}classUser{constructor(name,email){this.name=name;this.email=email;}getinfo(){console.log(this.name);}staticdescription(){console.log('Iamdescription--static');}seturls(values){console.log(values);this.urlsvalue=values;}geturls(){return`hellourls${this.urlsvalue}`;}}//class实现继承(附带es5继承方法)classAnimal{constructor(name){this.name=name;this.belly=[];}eat(food){this.belly.push(food);}speak(){console.log('Iamlucky')}}classDogextendsAnimal{constructor(name,age...

js排序的2种方法,好用

1、通过sort()方法,简单暴力我喜欢的。vararr=[21,100,-6,99,1]functionsortNum(a,b){returna-b;}arr.sort(sortNum);console.log(arr);2、普通冒泡排序方法,比较原始好懂。vararr=[210,100,6,99,1,12];vartimeData;for(variinarr){for(varyinarr){if(arr[i]<arr[y]){times=arr[i];arr[i]=arr[y];arr[y]=times;}}}console.log(arr); 如果对小哥哥小姐姐有帮助请点个推荐哈,欢迎留言、评论、搞事!!(程序员气质双肩包。biy1314.taobao.com)...

HashSet非常的消耗空间,TreeSet因为有排序功能,因此资源消耗非常的高,我们应该尽量少使用

注:HashMap底层也是用数组,HashSet底层实际上也是HashMap,HashSet类中有HashMap属性(我们如何在API中查属性)。HashSet实际上为(key.null)类型的HashMap。有key值而没有value值。 正因为以上的原因,TreeSet和TreeMap的实现也有些类似的关系。注意:TreeSet和TreeMap非常的消耗时间,因此很少使用。我们应该熟悉各种实现类的选择——非常体现你的功底。 HashSetVSTreeSet:HashSet非常的消耗空间,TreeSet因为有排序功能,因此资源消耗非常的高,我们应该尽量少使用,而且最好不要重复使用。基于以上原因,我们尽可能的运用HashSet而不用TreeSet,除非必须排序。同理:HashMap VS TreeMap:一般使用HashMap,排序的时候使用TreeMap。HashMapVSHashtable(注意在这里table的第一个字母小写)之间的区别有些类似于ArrayList和Vector,Hashtable是重量级的组件,在考虑并发的情况,对安全性要...

HashMap与HashCode有关,用Sort对象排序

 遍历Map,使用keySet()可以返回set值,用keySet()得到key值,使用迭代器遍历,然后使用put()得到value值。上面这个算法的关键语句:Sets=m.keySet();Interatorit=newinterator();Objectkey=it.next();Objectvalue=m.get(key); 注意:HashMap与HashCode有关,用Sort对象排序。如果在HashMap中有key值重复,那么后面一条记录的value覆盖前面一条记录。 Key值既然可以作为对象,那么也可以用一个自定义的类。比如:m.put(newsutdent(“Liucy”,30),”boss”)如果没有语句来判定Student类对象是否相同,则会全部打印出来。 当我们用自定义的类对象作为key时,我们必须在程序中覆盖HashCode()和equals()。  1packageTomTexts;23publicclassTomTexts_16{4publicstaticvoidmain(Stringargs[])5...

规则用来判断对象;算法是考虑如何排序

通过语句:Iteratorit=c.iterator();得到一个迭代器,将集合中所有元素顺序排列。然后可以通过interator方法进行遍历,迭代器有一个游标(指针)指向首位置。Interator有hasNext(),用于判断元素右边是否还有数据,返回True说明有。然后就可以调用next动作。Next()会将游标移到下一个元素,并把它所跨过的元素返回。(这样就可以对元素进行遍历)集合中每一个元素都有对象,如有字符串要经过强制类型转换。Collections是工具类,所有方法均为有用方法,且方法为static。有Sort方法用于给List排序。Collections.Sort()分为两部分,一部分为排序规则;一部分为排序算法。规则用来判断对象;算法是考虑如何排序。 1packageTomTexts;23abstractclassA{4abstractintadd(intx,inty);5intsub(intx,inty){6returnx-y;7}8}9classBextendsA{10intadd(intx,inty){//子类必须重写父类的add方法11returnx+...
首页上一页...1112131415...下一页尾页