面试的时候经常会遇到面试官让你直接手写排序算法,下面是冒泡排序和快速排序的实现。


冒泡排序

基本流程就是,自下而上比较相邻的两个元素进行比较,让大的元素往下面沉,较小的往上冒。按照排序规则进行比较,如果是跟排序的规则相反就需要调整互换。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package  cn.test1;
 
import  org.apache.commons.lang.ArrayUtils;
 
public  class  BubbleSort {
 
     public  static  void  main(String[] args) {
         int [] array = {  1 12 34 3 56 6 9 10 12  };
         bubbleSort(array);
 
         for  ( int  i : array) {
             System.out.println(i);
         }
     }
 
     public  static  void  bubbleSort( int [] array) {
         if  (ArrayUtils.isEmpty(array)) {
             return ;
         }
 
         int  length = array.length;
         for  ( int  i =  0 ; i < length -  1 ; i++) {
             for  ( int  j =  1 ; j < length -  1 ; j++) {
                 if  (array[j] > array[j +  1 ]) {
                     int  temp = array[j];
                     array[j] = array[j +  1 ];
                     array[j +  1 ] = temp;
                 }
             }
         }
 
     }
 
}


快速排序:

基本思想:先找准基数,随意选择数组一个元素,作为基数,不过一般选择数组头或者尾作为基数,如果选择了其他的元素,也要首先交换到末尾或者头。

分区过程:比基数大的放在右边,比基数小的放在左边。重复下去就可以排序了。

看下代码,自己试试,debug一下,会更清楚些。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
package  cn.test1;
 
public  class  QuickSort {
 
     public  static  void  main(String[] args) {
         QuickSort qs =  new  QuickSort();
         int [] array = {  78 34 12 64 5 4 62 99 98 5 18 23 34 15 51  };
         qs.sort(array);
     }
 
     public  void  sort( int [] array) {
         quickSort(array,  0 , array.length -  1 );
     }
 
     /**
      * 通过划分,基于分治思想,递归执行子任务排序最后合并
     
      * @param low
      *            数组首位索引
      * @param high
      *            数组末尾索引
      */
     public  void  quickSort( int [] array,  int  low,  int  high) {
         int  middleIndex;
         if  (low < high) {
             middleIndex = getMiddleIndex(array, low, high);
             quickSort(array, low, middleIndex -  1 );
             quickSort(array, middleIndex +  1 , high);
         }
     }
 
     /**
      * 简单划分方法
      */
     public  int  getMiddleIndex( int [] array,  int  i,  int  j) {
         int  pivot = array[i];  // array[i] 就是 第一个坑
 
         while  (i < j) {
             while  (i < j && array[j] >= pivot) {
                 j--;  // 从右向左找出小于基准数pivot的数来填充array[i]
             }
 
             if  (i < j) {
                 array[i] = array[j];  // 将array[j]填充到array[i]中,array[j]就形成了一个新的坑
                 i++;
             }
 
             while  (i < j && array[i] <= pivot) {
                 i++;  // 从左向右找出大于基准数pivot的数来填充array[j]
             }
 
             if  (i < j) {
                 array[j] = array[i];  // 将array[i]填充到array[j]中,array[i]就形成了一个新的坑
                 j--;
             }
         }
         array[i] = pivot;  // 退出时,i等于j。将pivot填到这个坑中。
         return  i;
     }
}