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

冒泡排序

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

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;
    
}
}