冒泡排序的分析:
1.普通:
public
static
void
bubbleSort(
int
[]
a
){
int
n
=
a
.
length
,
temp
= 0;
for
(
int
i
=0;
i
<
n
;
i
++){
for
(
int
j
=1;
j
<
n
-
i
;
j
++){
if
(
a
[
j
-1]>
a
[
j
]){
temp
=
a
[
j
];
a
[
j
] =
a
[
j
-1];
a
[
j
-1] =
temp
;
}
}
}
}
分析:相邻元素相比较,逆序则换位置,把最大(小)的元素放在数组最后,然后次大(小)......一直排完所有元素。时间复杂度为O(n2)。
2.改进后的冒泡排序:
public
static
void
bubblePro1(
int
[]
a
) {
int
n
=
a
.
length
;
boolean
sorted
=
false
;
while
(!
sorted
) {
// 如果扫描过的数据都已经排好序,sorted结果是true,直接跳出循环
sorted
=
true
;
for
(
int
i
= 1;
i
<
n
;
i
++) {
if
(
a
[
i
- 1] >
a
[
i
]) {
sorted =
false
;
// 发生过a[i-1]>a[i],不能确定已扫描过的数是否已经排好
int
temp
=
a
[
i
];
a
[
i
] =
a
[
i
- 1];
a
[
i
- 1] =
temp
;
// 交换位置
}
}
n
--;
// a[n-1]位已经是最大的数,n应减一
}
}
}
分析:可以在扫描过程中提前结束,这种情况发生的原因是,除了数组尾部的数据已经排好之外,前面的数据也已经排好。增加一个标志sorted,来判断前面部分的数据是否已经排好。
性能缺点:
1 | 2 | 3 |
如图,扫描过后3是已经排好的,1,2是仍然需要扫描的数。但是2的次序也已经排好,由于1是乱序的,因而也需要扫描,因此仍可以优化。
3.再改进后的冒泡排序:
public
static
void
bubblePro2(
int
[]
a
){
int
n
=
a
.
length
;
boolean
sorted
=
false
;
int
label
= 0;
while
(!
sorted
) {
// 如果扫描过的数据都已经排好序,sorted结果是true,直接跳出循环
sorted
=
true
;
for
(
int
i
= 1;
i
<
n
;
i
++) {
if
(
a
[
i
- 1] >
a
[
i
]) {
sorted
=
false
;
// 发生过a[i-1]>a[i],不能确定已扫描过的数是否已经排好
int
temp
=
a
[
i
];
a
[
i
] =
a
[
i
- 1];
a
[
i
- 1] =
temp
;
// 交换位置
label
=
i
;
//记录最后发生交换的位置
}
}
n
=
label
;
// label之后的数已经排好,不必再扫描
}
}