博客一,常见的几种排序算法的Java实现
2015-09-17 00:02
756 查看
一、插入排序
算法导论上有很形象的比喻,把插入排序类比成扑克牌,默认你手里本身拥有的第一张是有序的,第二章和第一张对比后决定其位置,以此类推。代码如下:
二、希尔排序
希尔排序就是插入排序的一种变形,只不过希尔排序引入了步长的概念,数组中的数字一次移动的距离比直接插入排序要大,减少了数组移动操作的次数。
当步长为1时,希尔排序变成直接插入排序。代码如下
三、堆排序
堆排序的时间复杂度是o(nlgn),但是空间复杂度是o(1),堆排序的主要操作就是建堆和调整,排序过程中也是将数组分成有序区和无序区,每次找出无序区中的最大(最小)值加入有序区。一切操作都是在数组上完成,切勿真的去建树,树是数组的逻辑结构。代码如下:
四、快排
快排每次的关键就是找到左边比标志大的节点,右边比标识小的节点,两者交换位置。
代码如下:
五、归并排序
归并排序基于分治的思想,递归调用。代码如下:
六、冒泡排序
每次找出无序序列的最小(最大)代码如下
七、选择排序
每次从数组中选出最大值(最小值)输出,代码如下:
算法导论上有很形象的比喻,把插入排序类比成扑克牌,默认你手里本身拥有的第一张是有序的,第二章和第一张对比后决定其位置,以此类推。代码如下:
public class InsertSort { public void insertSort(int[] a){ if(a==null||a.length==0||a.length==1){ return ; } //i代表已有序的数组元素的边界, for(int i = 0 ; i<a.length-1 ;i++){ int j = i+1 ; int temp = a[j];//保存j位置的元素 while(j>=1&&temp < a[j-1]){ a[j] = a[j-1] ; j-- ;//找到药插入的位置 } a[j] = temp ; } } public static void main(String[] args) { InsertSort is = new InsertSort() ; int[] a = {} ; is.insertSort(a); for(int i = 0 ; i < a.length ;i++){ System.out.print(a[i]+" "); } } }
二、希尔排序
希尔排序就是插入排序的一种变形,只不过希尔排序引入了步长的概念,数组中的数字一次移动的距离比直接插入排序要大,减少了数组移动操作的次数。
当步长为1时,希尔排序变成直接插入排序。代码如下
public class ShellSort { public void shellSort(int[] a){ int j = 0 ; int temp = 0 ; for(int d = a.length/2 ; d>0 ;d/=2){ for(int i = d ; i < a.length ; i++){ temp = a[i] ; for(j = i ; j>=d ;j=j-d ){ if(temp>a[i-d]){ a[j] = a[j-d] ; } else{ break ; } } a[j] =temp ; } } } public static void main(String[] args) { int[] a = {10,9,4,-1,7,9,5,6,2,-3} ; ShellSort ss = new ShellSort() ; ss.shellSort(a); for(int i = 0 ; i<a.length ;i++){ System.out.print(a[i]+" "); } }
三、堆排序
堆排序的时间复杂度是o(nlgn),但是空间复杂度是o(1),堆排序的主要操作就是建堆和调整,排序过程中也是将数组分成有序区和无序区,每次找出无序区中的最大(最小)值加入有序区。一切操作都是在数组上完成,切勿真的去建树,树是数组的逻辑结构。代码如下:
public class HeapSort { public void heapSort(int[] a){ if(a==null||a.length==0||a.length==1){ return ; } for(int i = 0 ; i < a.length ;i++){ createMaxHeap(a,a.length-1-i) ; swap(a,0,a.length-1-i) ; } } private void swap(int[] a, int i, int j) { int temp = a[j]; a[j] =a[i]; a[i] = temp ; } private void createMaxHeap(int[] a, int lastIndex) { for(int i = (lastIndex-1)/2 ; i>=0 ;i--){ int k = i ; while(2*k+1<=lastIndex){ int biggerIndex = 2*k+1 ; if(biggerIndex<lastIndex&&a[biggerIndex]<a[biggerIndex+1]){ biggerIndex++ ; } if(a[k]<a[biggerIndex]){ swap(a,k,biggerIndex); k = biggerIndex ; } else{ break ; } } } } public static void main(String[] args) { HeapSort hs = new HeapSort() ; int[] a = {9,-1,0,3,6,7,2} ; hs.heapSort(a); for(int i = 0 ; i<a.length ;i++){ System.out.print(a[i]+" ") ; } } }
四、快排
快排每次的关键就是找到左边比标志大的节点,右边比标识小的节点,两者交换位置。
代码如下:
public class Qsort { public void qSort(int[] a ,int left ,int right){ if(a==null||a.length==0||a.length==1){ return ; } int piovt = partion(a,left,right) ; if(left<piovt){ qSort(a,left,piovt-1) ; } if(right>piovt){ qSort(a,piovt,right) ; } } private int partion(int[] a, int left, int right) { int index = a[(left+right)/2]; while(left<right){ while(a[left]<index){ left++ ; } while(a[right]>index){ right-- ; } if(left<=right){ exchange(a,left,right) ; left++ ; right-- ; } } return left; } private void exchange(int[] a, int left, int right) { int temp = a[left] ; a[left] = a[right] ; a[right] = temp ; } public static void main(String[] args) { Qsort qs = new Qsort() ; int[] a = {5,9,2,1,4,0,-5,-7,-1} ; qs.qSort(a, 0, a.length-1); for(int i = 0 ;i<a.length ;i++){ System.out.print(a[i]+" "); } } }
五、归并排序
归并排序基于分治的思想,递归调用。代码如下:
public class MergeSort { public void mergeSort(int[] a,int left ,int right){ if(a==null||a.length==0||a.length==1){ return ; } int middle = (left+right)/2; if(left<right){ mergeSort(a,left,middle); mergeSort(a,middle+1,right) ; } merge(a,left,middle,right) ; } private void merge(int[] a, int begin, int middle, int end) { int[] temp = new int[end-begin+1] ; int i = 0 , j = begin , k = middle+1 ; while(j<=middle&&k<=end){ if(a[j]<=a[k]){ temp[i] = a[j]; j++ ; } else{ temp[i] = a[k]; k++ ; } i++ ; } while(j<=middle){ temp[i] = a[j] ; i++ ; j++ ; } while(k<=end){ temp[i] = a[k] ; i++ ; k++ ; } for(int l = 0 ; l < temp.length ;l++){ a[begin+l] = temp[l] ; } } public static void main(String[] args) { int[] a = {3,9,1,2,6,0,-1,-4,15} ; MergeSort ms = new MergeSort() ; ms.mergeSort(a, 0, a.length-1); for(int i = 0 ;i<a.length ;i++){ System.out.print(a[i]+" "); } } }
六、冒泡排序
每次找出无序序列的最小(最大)代码如下
public class BubbleSort { public void bubbleSort(int[] a){ if(a==null||a.length==0||a.length==1){ return ; } for(int i = 0 ; i < a.length ;i++){ for(int j = 1; j < a.length-i ;j++){ if(a[j] < a[j-1]){ exchange(a,j ,j-1) ; } } } } private void exchange(int[] a, int j, int i) { int temp = a[i] ; a[i] = a[j]; a[j] =temp ; } public static void main(String[] args) { int[] a = {3,9,1,0,7,-4,-6} ; BubbleSort bs = new BubbleSort() ; bs.bubbleSort(a); for(int i = 0 ; i < a.length ; i++){ System.out.print(a[i]+" ") ; } } }
七、选择排序
每次从数组中选出最大值(最小值)输出,代码如下:
public class SelectSort { public void selectSort(int[] a){ if(a==null||a.length==0){ return ; } for(int i = 0 ; i < a.length ;i++){ for(int j = i+1 ; j < a.length ;j++){ if(a[j] < a[i]){ exchange(a,i ,j) ; } } } } private void exchange(int[] a, int i, int j) { int temp = a[i]; a[i] = a[j] ; a[j] = temp ; } public static void main(String[] args) { SelectSort ss = new SelectSort() ; int[] a = {7,12,-1,3,7,9} ; ss.selectSort(a); for(int i = 0 ; i< a.length ;i++){ System.out.print(a[i]+" "); } } }
相关文章推荐
- java数据类型转换
- JavaWeb学习篇之----自定义标签&&JSTL标签库详解
- eclipse中使用egit创建分支
- spring mvc + JSR-303验证框架
- 堆栈的对比分析以及在Java中的一些要点
- 用Eclipse搭建web项目
- spring4mvc整合mybatis3
- java中HashMap,LinkedHashMap,TreeMap,HashTable的区别
- java基础-数组深入
- JAVA泛型(Generic)
- 深入理解java内存模型
- JDK Logging模块深入分析
- java中JVM的原理
- Java logging API之配置方法
- Java类和对象
- 《Java特种兵》
- java.util.logging.Logger 使用详解
- 初次接触Java
- 自己动手写一个Spring (Spring 到底是怎么跑起来的)
- Java安全管理器——SecurityManager