码迷,mamicode.com
首页 > 编程语言 > 详细

博客一,常见的几种排序算法的Java实现

时间:2015-09-17 01:06:13      阅读:256      评论:0      收藏:0      [点我收藏+]

标签:

一、插入排序

算法导论上有很形象的比喻,把插入排序类比成扑克牌,默认你手里本身拥有的第一张是有序的,第二章和第一张对比后决定其位置,以此类推。代码如下:

 1 public class InsertSort {
 2     public void insertSort(int[] a){
 3         if(a==null||a.length==0||a.length==1){
 4             return ;
 5         }
 6         //i代表已有序的数组元素的边界,
 7         for(int i = 0 ; i<a.length-1 ;i++){
 8             int j = i+1 ;
 9             int temp = a[j];//保存j位置的元素
10             while(j>=1&&temp < a[j-1]){
11                 a[j] = a[j-1] ;
12                 j-- ;//找到药插入的位置
13             }
14             a[j] = temp ;
15         }
16     }
17     public static void main(String[] args) {
18         InsertSort is = new InsertSort() ;
19         int[] a = {} ;
20         is.insertSort(a);
21         for(int i = 0 ; i < a.length ;i++){
22             System.out.print(a[i]+" ");
23         }
24     }
25 
26 }

二、希尔排序

希尔排序就是插入排序的一种变形,只不过希尔排序引入了步长的概念,数组中的数字一次移动的距离比直接插入排序要大,减少了数组移动操作的次数。

当步长为1时,希尔排序变成直接插入排序。代码如下

 1 public class ShellSort {
 2     public void shellSort(int[] a){
 3         int j = 0 ;
 4         int temp = 0 ;
 5         for(int d = a.length/2 ; d>0 ;d/=2){
 6             for(int i = d ; i < a.length ; i++){
 7                 temp = a[i] ;
 8                 for(j = i ; j>=d ;j=j-d ){
 9                     if(temp>a[i-d]){
10                         a[j] = a[j-d] ;
11                     }
12                     else{
13                         break ;
14                     }
15                 }
16             a[j] =temp ;    
17             }
18         }
19     }
20     public static void main(String[] args) {
21         int[] a = {10,9,4,-1,7,9,5,6,2,-3} ;
22         ShellSort ss = new ShellSort() ;
23         ss.shellSort(a);
24         for(int i = 0 ; i<a.length ;i++){
25             System.out.print(a[i]+" ");
26         }
27     }

三、堆排序

堆排序的时间复杂度是o(nlgn),但是空间复杂度是o(1),堆排序的主要操作就是建堆和调整,排序过程中也是将数组分成有序区和无序区,每次找出无序区中的最大(最小)值加入有序区。一切操作都是在数组上完成,切勿真的去建树,树是数组的逻辑结构。代码如下:

 1 public class HeapSort {
 2     public void heapSort(int[] a){
 3         if(a==null||a.length==0||a.length==1){
 4             return ;
 5         }
 6         for(int i = 0 ; i < a.length ;i++){
 7             createMaxHeap(a,a.length-1-i) ;
 8             swap(a,0,a.length-1-i) ;
 9         }
10     }
11     private void swap(int[] a, int i, int j) {
12         int temp = a[j];
13         a[j] =a[i];
14         a[i] = temp ;
15     }
16     private void createMaxHeap(int[] a, int lastIndex) {
17         for(int i = (lastIndex-1)/2 ; i>=0 ;i--){
18             int k = i ;
19             while(2*k+1<=lastIndex){
20                 int biggerIndex = 2*k+1 ;
21                 if(biggerIndex<lastIndex&&a[biggerIndex]<a[biggerIndex+1]){
22                     biggerIndex++ ;
23                 }
24                 if(a[k]<a[biggerIndex]){
25                     swap(a,k,biggerIndex);
26                     k = biggerIndex ;
27                 }
28                 else{
29                     break ;
30                 }
31             }
32         }
33     }
34     public static void main(String[] args) {
35          HeapSort hs = new  HeapSort() ;
36          int[] a = {9,-1,0,3,6,7,2} ;
37          hs.heapSort(a);
38          for(int i = 0 ; i<a.length ;i++){
39              System.out.print(a[i]+" ") ;
40          }
41     }
42 
43 }

四、快排

快排每次的关键就是找到左边比标志大的节点,右边比标识小的节点,两者交换位置。

代码如下:

 1 public class Qsort {
 2     public void qSort(int[] a ,int left ,int right){
 3         if(a==null||a.length==0||a.length==1){
 4             return ;
 5         }
 6         int piovt = partion(a,left,right) ;
 7         if(left<piovt){
 8             qSort(a,left,piovt-1) ;
 9         }
10         if(right>piovt){
11             qSort(a,piovt,right) ;
12         }
13         
14     }
15     private int partion(int[] a, int left, int right) {
16         int index = a[(left+right)/2];
17         while(left<right){
18             while(a[left]<index){
19                 left++ ;
20             }
21             while(a[right]>index){
22                 right-- ;
23             }
24             if(left<=right){
25                 exchange(a,left,right) ;
26                 left++ ;
27                 right-- ;
28             }
29         }
30         return left;
31     }
32     private void exchange(int[] a, int left, int right) {
33         int temp = a[left] ;
34         a[left] = a[right] ;
35         a[right] = temp ;
36     }
37     public static void main(String[] args) {
38         Qsort qs = new Qsort() ;
39         int[] a = {5,9,2,1,4,0,-5,-7,-1} ;
40         qs.qSort(a, 0, a.length-1);
41         for(int i = 0 ;i<a.length ;i++){
42             System.out.print(a[i]+" ");
43         }
44 
45     }
46 
47 }

五、归并排序

归并排序基于分治的思想,递归调用。代码如下:

 1 public class MergeSort {
 2     public void mergeSort(int[] a,int left ,int right){
 3         if(a==null||a.length==0||a.length==1){
 4             return ;
 5         }
 6         int middle = (left+right)/2;
 7         if(left<right){
 8             mergeSort(a,left,middle);
 9             mergeSort(a,middle+1,right) ;
10         }
11         merge(a,left,middle,right) ;
12     }
13     private void merge(int[] a, int begin, int middle, int end) {
14         int[] temp = new int[end-begin+1] ;
15         int i = 0  , j = begin , k = middle+1 ;
16         while(j<=middle&&k<=end){
17             if(a[j]<=a[k]){
18                 temp[i] = a[j];
19                 j++ ;
20             }
21             else{
22                 temp[i] = a[k];
23                 k++ ;
24             }
25             i++ ;
26         }
27         while(j<=middle){
28             temp[i] = a[j] ;
29             i++ ;
30             j++ ;
31         }
32         while(k<=end){
33             temp[i] = a[k] ;
34             i++ ;
35             k++ ;
36         }
37         for(int l = 0 ; l < temp.length ;l++){
38             a[begin+l] = temp[l] ;
39         }
40     }
41     
42     public static void main(String[] args) {
43         int[] a = {3,9,1,2,6,0,-1,-4,15} ;
44         MergeSort ms = new MergeSort() ;
45         ms.mergeSort(a, 0, a.length-1);
46         for(int i = 0 ;i<a.length ;i++){
47             System.out.print(a[i]+" ");
48         }
49     }
50 
51 }

 

六、冒泡排序

每次找出无序序列的最小(最大)代码如下

 1 public class BubbleSort {
 2     public void bubbleSort(int[] a){
 3         if(a==null||a.length==0||a.length==1){
 4             return ;
 5         }
 6         for(int i = 0 ; i < a.length ;i++){
 7             for(int j = 1; j < a.length-i ;j++){
 8                 if(a[j] < a[j-1]){
 9                     exchange(a,j ,j-1) ;
10                 }
11             }
12         }
13     }
14     private void exchange(int[] a, int j, int i) {
15         int temp = a[i] ;
16         a[i] = a[j];
17         a[j] =temp ;
18     }
19     public static void main(String[] args) {
20         int[] a = {3,9,1,0,7,-4,-6} ;
21         BubbleSort bs = new BubbleSort() ;
22         bs.bubbleSort(a);
23         for(int i = 0 ; i < a.length ; i++){
24             System.out.print(a[i]+" ") ;
25         }
26     }
27 
28 }

七、选择排序

每次从数组中选出最大值(最小值)输出,代码如下:

 1 public class SelectSort {
 2     public void selectSort(int[] a){
 3         if(a==null||a.length==0){
 4             return ;
 5         }
 6         for(int i = 0 ; i < a.length ;i++){
 7             for(int j = i+1 ; j < a.length ;j++){
 8                 if(a[j] < a[i]){
 9                     exchange(a,i ,j) ;
10                 }
11             }
12         }
13     }
14     private void exchange(int[] a, int i, int j) {
15         int temp = a[i];
16         a[i] = a[j] ;
17         a[j] = temp ;
18     }
19     public static void main(String[] args) {
20         SelectSort ss = new SelectSort() ;
21         int[] a = {7,12,-1,3,7,9} ;
22         ss.selectSort(a);
23         for(int i = 0 ; i< a.length ;i++){
24             System.out.print(a[i]+" ");
25         }
26     }
27 
28 }

 

博客一,常见的几种排序算法的Java实现

标签:

原文地址:http://www.cnblogs.com/huntertoung/p/4815009.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!