冒泡排序(BubbleSort)
执行流程
- 依次比较两个相邻元素如果前者比后者大,交换两者
- 一轮比较完毕,则最后一个元素为最大者
- 再进行第二轮比较,直到末尾
冒泡排序一
代码如下:
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
|
/*
* 交换,array i 和 j位置的元素
* */
protected void swap(int i1, int i2){
int tmp = array[i1];
array[i1] = array[i2];
array[i2] = tmp;
}
/*
* 比较两个下标的元素
* 返回值等于0 , 代表array[i1] == array[i2]
* 返回值 < 0, 代表array[i1] < array[i2]
* 返回值 > 0, 代表array[i1] > array[i2]
* */
protected int cmp(int i1, int i2){
return array[i1] - array[i2];
}
protected void sort() {
for (int i = array.length - 1; i >= 0; i--) {
for (int j = 0; j < i; j++) {
if (cmp(j, j+1) > 0){
swap(j, j+1);
}
}
}
}
|
优化一:
在全排序时,提前退出循环,不再遍历。
此中优化只对排序过程中提前全排序时,优化循环次数。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
protected void sort() {
// 全排序时,则不再遍历
for (int i = array.length - 1; i >= 0; i--) {
boolean sorted = true;
for (int j = 0; j < i; j++) {
if (cmp(j, j+1) > 0){
swap(j, j+1);
sorted = false;
}
}
if(sorted) break;
}
}
|
优化二:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
protected void sort() {
// 优化
// 记录交换位置
// 局部交换时,后边的有序了,后边的不再比较
for (int i = array.length - 1; i >= 0; i--) {
// 当完全有序时,一轮扫描结束
int sortedIdx = 0;
for (int j = 0; j < i; j++) {
if (cmp(j, j+1) > 0){
swap(j, j+1);
sortedIdx = j + 1;
}
}
i = sortedIdx;
}
}
|