距离矢量路由算法的java代码_八大排序算法比较(附Java代码)

冒泡排序

/*** 冒泡排序 比较好理解* 两两相比 较大的放后面* 时间复杂度O(n^2)*//*** 改进前的冒泡排序算法进行100,000数据排序运行时间为:3829ms* 优化后的冒泡排序算法进行100,000数据排序运行时间为:3551ms*/
public static void bubbleSort(int[] array){ //原始的冒泡排序,比较的次数是固定的int len=array.length;int temp=0;for(int i=0;i<len-1;i++){for(int j=0;j<len-1-i;j++){if(array[j]>array[j+1]){temp=array[j];array[j]=array[j+1];array[j+1]=temp;}}}
}public static void bubbleSort2(int[] array){ //改进的冒泡排序,有序时无需比较int len=array.length;int temp=0;boolean flag=true;for(int i=0;i<len-1;i++){for(int j=0;j<len-1-i;j++){if(array[j]>array[j+1]){flag=false;temp=array[j];array[j]=array[j+1];array[j+1]=temp;}}if(flag){ //如果有序 则跳出循环break;}else {flag=true;}}
}

插入排序

/*** 插入排序,将无序元素依次插入到有序数组中* 和选择排序很类似。但是其时间取决于数组的初始顺序* 时间复杂度为O(n^2)*//*** 由于数据量大时可能存在一堆数据后移的情况,所以时间并不一定比选择排序快* 插入排序算法进行50,000数据排序运行时间为:1280ms*/
public static void insertSort(int[] array){int temp=0;int len=array.length;for(int i=1;i<len;i++){for(int j=i;j>0;j--){if(array[j]<array[j-1]){temp=array[j];array[j]=array[j-1];array[j-1]=temp;}}}
}

选择排序

/*** 选择排序* 与冒泡排序不同,无需频繁进行交换的操作,时间较冒泡排序短* 时间复杂度为O(n^2)*//*** 选择排序算法进行50,000数据排序运行时间为:626ms*/public static void selectSort(int[] array){int len=array.length;int temp=0;for (int i=0;i<len;i++){int min=i;  //min为最小值对应的索引for(int j=i;j<len;j++){ //内层循环的目的是为了找到最小值if(array[j]<array[min]){min=j;}}temp=array[min];array[min]=array[i];array[i]=temp;}
}

希尔排序

/*** 希尔排序* 插入排序的变种,慢慢地调整数组的顺序,使插入排序效率变高* 最坏情况下时间复杂度为O(n^(1-2))*//*** 希尔排序的效率肯定是要比插入排序要高的* 希尔排序算法进行50,000数据排序运行时间为:705ms*/
public static void shellSort(int[] array){int len=array.length;int h=1;while(h<len/3)h=3*h+1; //希尔排序的增量,相邻增量应该尽可能互斥!!!  h=1,4,13,40,121...int temp=0;while (h>=1){for (int i=h;i<len;i++){for(int j=i;j>=h;j-=h){if(array[j]<array[j-h]){temp=array[j];array[j]=array[j-h];array[j-h]=temp;}}}h/=3;}
}

快速排序

/*** 快速排序* 使用递归的方法,有一些难以理解,多看几遍就好* 主要思想就是设定pivot,将所有比pivot大的放右边,比pivot小的放左边* 平均的时间复杂度为O(nlogn) ,有序情况下的复杂度为O(n^2)*//*** 快排是真的快 ,比冒泡插入选择希尔要快上好多* 快速排序算法进行50,000数据排序运行时间为:4.00ms*/
public static void quickSort(int[] array, int left, int right){if(left>right){  //递归结束的条件!!! 没有这个 递归就出不来了return;}int L=left,R=right;int pivot=array[left];  //pivot随意设置,这里我们设置pivot为最左边的元素while (left<right){while (array[right]>=pivot && right>left){ //一定要大于等于或者小于等于 不然数字相同可能出现死循环right--; //右指针不断后移}if(right>left){array[left]=array[right]; //左右指针不重合时,将right的值赋给left}while (array[left]<=pivot && right>left){left++; //左指针开始移动}if(left<right){array[right]=array[left];}}array[left]=pivot; //完成第一次排序quickSort(array,L,left-1);quickSort(array,left+1,R);
}

归并排序

/*** 归并排序* 同样使用递归,采用分而治之的想法,通过递归的方式将若干个有序序列合并为一个* 时间复杂度为 O(nlogn),同样非常快*//*** 归并排序算法进行50,000数据排序运行时间为:4.90ms*/public static void merge(int[] array,int left,int mid,int right){ //进行归并操作的函数int[] temp=new int[right-left+1]; //建立缓存数组int i=left,j=mid+1;int index=0;  //temp的索引while (i<=mid && j<=right){if(array[i]<=array[j]){
//                temp[index]=array[i];
//                i++;
//                index++;temp[index++]=array[i++]; //这段代码可以简化成这个形式}else {temp[index++]=array[j++];}}while (i<=mid){temp[index++]=array[i++];}while (j<=right){temp[index++]=array[j++];}for (int k=left;k<=right;k++){ //将temp传回arrayarray[k]=temp[k-left];}
}public static void mergeSort(int[] array,int left,int right){ //归并排序if(left>=right){return;}int mid=(left+right)/2;mergeSort(array,left,mid);mergeSort(array,mid+1,right);  //先分解成最小的merge(array,left,mid,right); //再合并
}

基数排序

/*** 基数排序* 空间换时间,所以时间复杂度最低,为 O(d(n+r)) r是基数(基本都是10),d为长度。。。  可趋近于O(n)* PS:我反而觉得基数排序比较复杂,提前需要设置很多变量和数组*//*** 基数排序算法进行50,000数据排序运行时间为:2.35ms*/
public static void radixSort(int[] array){int max=array[0];for (int i=1;i<array.length;i++){if(array[i]>max){max=array[i];  //首先找到数组中的最大数}}int times=(max+"").length(); //得到桶排序的轮数,也就是最大数有几位int[][] temp=new int[10][array.length]; //定义10个桶,每个桶的容量为元素总个数int t=1; //t表示第几轮int n=1; //每过一轮n*10,为了得到相应位的数字int num;int[] orderTemp=new int[10]; //数组orderTemp[i]用来表示该位是i的数的个数while (t<=times){for(int i=0;i<array.length;i++){num=(array[i]/n)%10;temp[num][orderTemp[num]]=array[i];orderTemp[num]++;}int index=0;for (int i=0;i<10;i++){if(orderTemp[i]>0){ //如果桶中元素大于0for (int j=0;j<orderTemp[i];j++){array[index++]=temp[i][j];}}orderTemp[i]=0; //一定要把桶子清空哦!!}n*=10;t++;}
}

堆排序

/*** 堆排序* 1)将待排序的序列构造成一个大顶堆* 2)将根节点与末尾元素交换,末尾元素就为最大值* 3)剩余数据重新构造成一个大顶堆* 4)不断执行操作,完成排序* 时间复杂度为O(nlogn)*//*** 堆排序算法进行50,000数据排序运行时间为:4.07ms*/public static void adjustHeap(int[] arr,int i, int length){ //调整一个以i为顶点的子树int temp=arr[i];for (int k=i*2+1;k<length;k=k*2+1){if(k+1<length && arr[k]<arr[k+1]){k++;  //如果左叶子小于右叶子,k就变成右叶子}if (temp<arr[k]){  //对子树进行调整.  注意!这里要用temp来比较不能用a[i],我们目的是把temp进行移动arr[i]=arr[k];i=k;} else {break;  //说明该子树已然是一个最大堆,直接跳出循环即可}}arr[i]=temp;
}public static void heapSort(int[] arr){for(int i=arr.length/2-1;i>=0;i--){  //i从最后一个非叶子节点开始。位置为i=arr.length/2-1adjustHeap(arr,i,arr.length); //该步骤为建立一个最大堆}for (int i=arr.length-1;i>0;i--){int temp=arr[i];arr[i]=arr[0];arr[0]=temp;adjustHeap(arr,0,i);}
}

完结撒花~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/332323.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jaxb注解使用_使用JAXB时

jaxb注解使用并没有很多例子可以说明这一点&#xff0c;但是如何在应用程序中使用JAXB可以在性能&#xff08;和内存使用&#xff09;方面产生巨大差异。 这个例子 在此博客文章中&#xff0c;我将使用一个名为Membership的示例对象&#xff0c;看起来像这样&#xff1a; 我们…

org.apache.tomcat.util.descriptor.web.WebXml.setVersion 未知版本字符串 [4.0]

参考&#xff1a; https://blog.csdn.net/qq_40829288/article/details/93936261 https://www.shuzhiduo.com/A/Ae5RnvaN5Q/ https://www.cnblogs.com/youpeng/p/11095504.html

python无法安装pycurl_Python安装pycurl失败的解决方法

Centos安装pycurlcentos 安装pycurlyum install python-devel curl-develpip3 install pycurlMac(老版本)安装pycurl解决MacOS升级后出现xcrun: error: invalid active developer path, missing xcrun的问题xcode-select --install然后dongchang-5:qqmusic baoshan$ pip3 insta…

组装一台计算机 java_如何在同一台计算机上安装多个Java版本

组装一台计算机 java一段时间以前&#xff0c;我写了一篇文章《 用示例解释Java Lambda表达式》&#xff0c;但是我很容易浏览Java 8&#xff0c;因为我在项目中使用了Java 8&#xff0c;并且允许我安装和使用它。 但是在我当前的项目中&#xff0c;我们仍在使用Java 8&#xf…

字符串类型的日期如何存储到数据表Date类型的字段中

在使用 JDBC 访问数据库存储数据时&#xff0c;日期类型的数据必须是 java.sql.Date 的才能注入到 SQL 语句中。 因此这里是将字符串类型的日期转换成 java.util.Date&#xff0c;接着再转换成 java.sql.Date &#xff0c;最后注入到 SQL 语句中。 public class ProjectDAO { …

python执行linux命令返回结果_python执行linux命令的简单示例

对python执行linux命令的两种方法感兴趣的小伙伴&#xff0c;下面一起跟随编程之家 jb51.cc的小编两巴掌来看看吧&#xff01;python执行linux命令有两种方法&#xff1a;在此以Linux常用的ls命令为例&#xff1a;方法一&#xff1a;使用os模块shell# python>> import os…

web api开启错误提示_当HTTP状态代码不足时:处理Web API错误报告

web api开启错误提示RESTful Web API设计的一个领域&#xff08;经常被忽视&#xff09;是如何报告与业务或应用程序有关的错误和问题。 首先要想到HTTP状态代码的正确用法&#xff0c;尽管非常方便&#xff0c;但通常它的信息量还不够。 让我们以400错误请求为例。 是的&#…

会议室分配时间最长_论文导论动态任务分配GPU上图计算的高效处理方式

编者按GPU作为一种硬件&#xff0c;相比较于CPU来说&#xff0c;有更多的并行度和更高的带宽&#xff0c;在图像处理领域取得了非常好的应用效果。越来越多的研究也正试图将GPU也应用到图计算领域中&#xff0c;然而GPU适合进行规则运算&#xff0c;但是图是一种不规则的数据表…

JS(Javascript)校验表单项的内容是否合规

<script !src"">/*** 分析&#xff1a;* 1.给表单绑定onsubmit事件* 监听器中判断每个方法检验的结果&#xff0c;如果都是true&#xff0c;则监听器方法返回true&#xff1b;如果有一个为false,* 则监听器方法返回false* 2.定义一些方法分别校验各个表单项* 3…

java \t怎么从头开始_如何从头开始以正确的面向对象方式创建Java Web Framework

java \t怎么从头开始您如何用Java设计Web应用程序&#xff1f; 您安装了Spring&#xff0c;阅读了手册&#xff0c;创建了控制器 &#xff0c;创建了一些视图&#xff0c;添加了一些注释 &#xff0c;它就可以工作了。 如果没有Spring &#xff08;Ruby中没有Ruby on Rails&…

kl散度的理解_以曲率的视角理解自然梯度优化

一个故事我要讲一个故事:一个你几乎肯定听过的故事&#xff0c;但它的侧重点与你习以为常关注的不同。所有现代深度学习模型都使用梯度下降进行训练。 在梯度下降的每个步骤中&#xff0c;您的参数值从某个起始点开始&#xff0c;然后将它们移动到最大损失减少的方向。 你可以通…

JSP的学习笔记

文章目录概念原理JSP 脚本JSP 内置对象概念 Java Server Pages &#xff1a;Java 服务器端页面 可以理解为&#xff1a;一个特殊的页面&#xff0c;其中既可以指定定义 html 标签&#xff0c;又可以定义 Java 代码 用于简化 Servlet 中的输出页面数据的代码的书写!!! 原理 J…

程序员面试算法_程序员的前20个搜索和排序算法面试问题

程序员面试算法大家好&#xff0c;如果您正在准备编程工作面试或正在寻找新工作&#xff0c;那么您知道这不是一个容易的过程。 在您职业的任何阶段&#xff0c;您都必须幸运地接到电话并进行第一轮面试&#xff0c;但是在初学者方面&#xff0c;当您寻找第一份工作时就更加困难…

御用导航提示页面_UI网站导航设计知识与五个知识案例

导航设计是网站的基石。它确定了至关重要的指标&#xff0c;例如转化率和跳出率&#xff0c;页面停留时间&#xff0c;点击量&#xff0c;并且通常是决定您的访问者拥有良好体验并以比您所说的“用户流量”更快退出网站的决定性因素。但是&#xff0c;好的设计是什么样的呢?一…

Servlet规范中定义的过滤器

文章目录什么是过滤器写过滤器的步骤配置初始化参数过滤器的优先级过滤器的优点过滤器执行过程图解过滤敏感词的示例代码使用 Servlet 来过滤敏感词使用过滤器来过滤敏感词通过配置初始化参数来设置敏感词关于 web.xml 的配置什么是过滤器 Servlet 规范当中定义的一种特殊的类…

Spring Boot错误–创建在类路径资源DataSourceAutoConfiguration中定义的名称为“ dataSource”的bean时出错...

大家好&#xff0c;如果您使用的是Spring Boot&#xff0c;并且遇到诸如“无法为数据库类型NONE确定嵌入式数据库驱动程序类”或“在类路径资源ataSourceAutoConfiguration中定义的名称为dataSource的bean创建错误”之类的错误&#xff0c;那么您来对地方了地点。 在本文中&…

simulink怎么生成vxworks的执行程序_从EPB模型谈谈Simulink代码生成

前段时间有读者朋友问代码生成的例子&#xff0c;说他正在做EPB的仿真模型&#xff0c;但总是和应用串不到一块去&#xff0c;我这里就从一个简单EPB控制模型来谈谈simulink代码生成&#xff0c;总结代码生成方法的同时也顺便回答他的问题。1.EPB模型准备用来举例说明的模型很简…

通过Socket实现文件上传/上传文件

文章目录整个功能的实现步骤客户端的实现步骤服务端的实现步骤示例代码整个功能的实现步骤 1.客户端使用本地的字节输入流读取被上传的文件数据 2.客户端使用网络字节输出流&#xff0c;将读取到的文件数据发送给服务端 3.服务端使用网络字节输入流读取客户端发送过来的文件数…

构造函数调用默认构造函数_显式无参数构造函数与默认构造函数

构造函数调用默认构造函数大多数不熟悉Java的开发人员都会Swift了解到&#xff0c;如果他们没有指定至少一个显式构造函数&#xff0c;则会为Java类隐式创建一个“ 默认构造函数 ”&#xff08; 由javac进行创建&#xff09;。 Java语言规范的 8.8.9节简要指出&#xff1a;“如…

Artifact到底是什么

将项目构建成一个可以在服务器部署的文件包&#xff08;如&#xff1a;war 包或者 exploded 的文件包&#xff09;&#xff0c;或者构建成的 jar 包&#xff08;这些 jar 包通常是某些模块程序文件&#xff0c;也可以是某些插件程序文件&#xff09;&#xff0c;这些都叫 Artif…