常用的排序算法-java
来源:互联网 发布:数据库前置机 编辑:程序博客网 时间:2024/05/24 06:49
冒泡排序: 时间复杂度o(n^2)
原理是临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换,这样一趟过去后,最大或最小的数字被交换到了最后一位,然后再从头开始进行两两比较交换,直到倒数第二位时结束
public void sort(int [] a){ for(int i =0;i < a.length;i++ ){ for(int j =1;i< a.length-1;j++){ if(a[j]< a[j-1]){ //相邻两个元素的遍历,每次只能得到一个最小值或者最大值 swap(a[j] , a[j-1]); } } } }
选择排序 o(n^2)
第1趟,在待排序记录r[1]~~r[n]中选出最小的记录,将它与r[1]交换;第2趟,在待排序记录r[2]~r[n]中选出最小的记录,将它与r[2]交换;以此类推,第i趟在待排序记录r[i]~r[n]中选出最小的记录,将它与r[i]交换,使有序序列不断增长直到全部排序完毕。
void sort(int [] a){ for(int i =0;i < a.length ; i++){ int min =i;// for (int j =i+1; j < a.length ;j++){ if(a [j] > a[min]){ //一次遍历得到最小值的坐标。和之前的最小值交换 min =j; } } swap(a[i], a[min]); }}
插入排序 o(n^2)
给定序列,存在一个分界线,分界线左边默认有序,右边默认无序(初始时默认第一个元素有序),每次取右边无序的第一个元素和左边有序的比较,并插入到左边合适的位置,分界线右移一位。
public void sort( int [] a){ int j =0; for (int i =1 ;i < a.length ; i++){ //默认a[i] 之前为有序序列 if(a[i] <a[i-1]){ int temp =a[i]; //把 a[i] 插入到a[i-1]之前有序序列的合适位置上去--> for( j=i-1;j >0&& a[j]>temp ;j--){ a[j+1] =a[j]; } a[j+1] =temp; } }}
希尔排序
定义一个增量,把序列按增量分组,对每组使用直接插入排序算法排序,然后增量递归的进行递减;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。
public void sort(int [] a){ int j =0,split =a.length; //split 为定义的增量,每次排序完成后split/2 直至split 为0时排序结束 while(split>0){ split =split/2; for( int i =split ;i <a.length ;i++){ if(a[i] <a[i -split]){ int temp =a[i]; for( j =i-split ; j>0&& a[j]>temp ;j=j-split){ a[j+split] =a[j]; } a[j+split] =temp; } } }}
堆排序 o(nlog^n)
堆排序利用的数据结构是完全二叉树,对于一颗完全二叉树 ,他的任意一个节点i的左右子节点是 2*i+1 2*i+2(如果节点存在的话) 堆分为大根堆和小根堆,是完全二叉树。大根堆的要求是每个节点的值都不大于其父节点的值。
基本思路是,构建一个完全二叉树,把他变成大根堆,然后每次把根节点(即最大值)移除,用最后的节点替代,这时数组长度减一继续构建大根堆。
public void sort( int [] a){ //最后一个节点的坐标是 a[a.length/2-1],一次添加构建大根堆 for( int j =a.length/2-1 ;j>0 ;j--){//先把数组构建成大根堆 makeMax(a,j,a,length) } for (int i =a.length-1 ;i > 1;i--){ swap(a[i],a[0]); //把大根堆的最大元素取出,放在数组末尾 makeMax(a,0 ,i); //重新构建大根堆 }}//构建大根堆,从根节点遍历,如果左右子叶大于根节点,则交换。//publci void makeMax(int [] a ,int start,int end){ int temp=a[start]; //根节点 int j =2*start+1; //左子叶 while(j< end){ if(j+1 < end && a[j]< a[j+1]){ //找到左右子叶中比较大的 j++; } if(temp > a[j]){ break; //当前节点大于左右子叶,跳出 } a[start] =a[j]; start =j; //节点和子叶均指向交换后的下一个节点和子叶 j=2*j+1; } a[start] =temp;}
归并排序 o(nlog^n)
将数组分成二组,如果这两组,如果这两组组内的数据都是有许多,那么就可以很方便的将这二组排序。如果这二组无序,就将这二组继续分成两组排序,当组里只有一个元素时是有序的,可以和相邻的元素合并
public void sort(int [] a ){ int temp=new int[a.length]; mergesort(a,0,a.length,temp);}public void mergesort(int [] a,int start ,int end ,int []temp){ if(end >start){ int middle =(end-start)/2; mergesort(a,start,middle,temp); mergesort(a,middle,end,temp); mergearray(a,start,middle,end,temp); }}public void metgearray(int [] a,int start,int middle,int end,int temp){ int i=j=k=l; whle(i < start &&j< end){ if(a[j]>a[i]){ temp[k++]=a[j++]; }else{ temp[k++]=a[i++]; } } if(i< start ){ temp[k++]=a[i++]; } if(j< end){ temp [k++]=a[k++]; } for (i =0;i< k;i++){ a[start+i]=temp[i]; }}
快速排序 o(nlog^n -n^2)
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
public void sort(int []a){ mergesort(a,0,a.length);}public void mergesort(int [] a ,int start ,int end){ while(start <end){ //得到中间数,数组左边的数比他小,右边的比他大 int middle =mergearray(a,start,end); mergesort(a,start,middle); mergesort(a,middle,end); }}public void mergearray(int [] a,int start ,int end){ int mid=a[start]; //默认第一个 int i=stat;j=end; while(i<j){ while (i<j&&a(j)>mid){ //从后向前遍历,找到第一个小于mid的元素,放在i处 j--; } if(j>i){ a[i]=a[j]; i++; } while(i<j&&a(i)<mid){ //从前向后遍历,找到第一个大于mid的元素,放在j处 i++; } if(j>i){ a[j]=a[i]; j--; } } a[i]=temp; //此时 i=j return i;}
- java常用的排序算法
- 常用的排序算法-java
- java常用排序算法
- Java 常用排序算法
- java常用排序算法
- java常用排序算法
- java 常用排序算法
- 常用Java排序算法
- Java常用排序算法
- Java常用排序算法
- Java常用排序算法
- Java 常用排序算法
- java常用排序算法
- java常用排序算法
- java 常用排序算法
- java常用排序算法
- Java常用排序算法
- Java常用排序算法
- 好记性不如烂笔头
- nova vnc proxy基本原理
- Java反射获取对象属性并设值
- 如何解决NullPointerException in android.view.GLES20RecordingCanvas
- opencv for python + 树莓派摄像头 常见错误
- 常用的排序算法-java
- oracle游标详解
- 入门级产品级产品经理工作中常见问题整理
- 定义工厂(Plant)
- 第四章 INI配置——跟我学习springmvc shiro mybatis
- 结果集映射,一些标签的用法
- springboot打war包部署到外部tomcat报错 parseWebXml Parse error
- 基本概念
- 函数传参—价格计算