冒泡排序
原理
:
相邻两个元素比较
,
大的放后边
,
比较的趟数是元素个数减
1
package
com.czz.Array;
public
class
ArraySort2 {
public
static
void
main(String[]
args
) {
int
[]
array
=
genArray
();
System.
out
.println(
"
排序前数组为
:"
);
printArray
(
arr
);
long
start
= System.
currentTimeMillis
();
bubbleSort
(
array
);
long
end
= System.
currentTimeMillis
();
System.
out
.println(
"
排序后的数组
:"
);
printArray
(
array
);
System.
out
.println(
"
时间差为
:"
+ (
end
-
start
));
}
//
产生随机数组
public
static
int
[] genArray() {
int
[]
arr
=
new
int
[1000];
for
(
int
i
= 0;
i
<
arr
.
length
;
i
++) {
arr
[
i
] = (
int
) (Math.
random
() * 1000 + 1);
}
return
arr
;
}
//
冒泡排序
public
static
void
bubbleSort(
int
[]
arr
) {
//
控制比较的轮数
:
固定值
:
元素个数
-1
for
(
int
i
= 0;
i
<
arr
.
length
- 1;
i
++) {
//
内层循环控制的是两两比较的次数
for
(
int
j
= 0;
j
<
arr
.
length
- 1 -
i
;
j
++) {
//
判断两个元素的大小
if
(
arr
[
j
] >
arr
[
j
+ 1]) {
int
tmp
=
arr
[
j
];
arr
[
j
] =
arr
[
j
+ 1];
arr
[
j
+ 1] =
tmp
;
}
}
}
}
//
生成数组
public
static
int
[] genArray() {
int
[]
arr
=
new
int
[10];
for
(
int
i
= 0;
i
<
arr
.
length
;
i
++) {
int
r
= (
int
) (Math.
random
() * 10 + 1);
while
(
isExist
(
arr
,
r
)) {
r
= (
int
) (Math.
random
() * 10 + 1);
}
arr
[
i
] =
r
;
}
return
arr
;
}
//
判断元素是否重复
public
static
boolean
isExist(
int
[]
arr
,
int
value
) {
for
(
int
i
= 0;
i
<
arr
.
length
;
i
++) {
if
(
arr
[
i
] ==
value
) {
return
true
;
}
}
return
false
;
}
选择排序
package
com.czz.test01;
public
class
CompareDemo {
public
static
void
main(String[]
args
) {
int
[]
arr
=
genArray
();
System.
out
.println(
"
排序前数组为
:"
);
printArray
(
arr
);
selectSort
(
arr
);
System.
out
.println(
"
排序后数组为
:"
);
printArray
(
arr
);
}
//
方法一
选择排序
/* public static
int
[] BubbleSort(
int
[]
arr
) {
for (
int
i = 0; i < arr.length - 1; i++) {
for (
int
j = i+1; j < arr.length ; j++) {
if (
arr
[i] >
arr
[j]) {
int
tmp
=
arr
[i];
arr
[i]=
arr
[j];
arr
[j] =
tmp
;
}
}
}
return
arr
;
}*/
//
方法二
public
static
int
[] selectSort(
int
[]
arr
) {
for
(
int
i
= 0;
i
<
arr
.
length
- 1;
i
++) {
int
index
=
i
;
int
value
=
arr
[
index
];
for
(
int
j
=
i
+ 1;
j
<
arr
.
length
;
j
++) {
if
(
arr
[
j
] <
value
) {
index
=
j
;
value
=
arr
[
j
];
}
}
//
判断是否有必要交换两个元素
if
(
index
!=
i
) {
int
tmp
=
arr
[
i
];
arr
[
i
] =
arr
[
index
];
arr
[
index
] =
tmp
;
}
}
return
arr
;
}
//
打印数组
public
static
void
printArray(
int
[]
arr
) {
for
(
int
i
= 0;
i
<
arr
.
length
;
i
++) {
System.
out
.print(
arr
[
i
] +
" "
);
}
System.
out
.println();
}
//
生成数组
public
static
int
[] genArray() {
int
[]
arr
=
new
int
[10];
for
(
int
i
= 0;
i
<
arr
.
length
;
i
++) {
int
r
= (
int
) (Math.
random
() * 20 + 1);
while
(
isExist
(
arr
,
r
)) {
r
= (
int
) (Math.
random
() * 10 + 1);
}
arr
[
i
] =
r
;
}
return
arr
;
}
//
判断元素是否重复
public
static
boolean
isExist(
int
[]
arr
,
int
value
) {
for
(
int
i
= 0;
i
<
arr
.
length
;
i
++) {
if
(
arr
[
i
] ==
value
) {
return
true
;
}
}
return
false
;
}
}
选择排序比较两种方法的循环比较次数
package
com.czz.Array;
/*
*
优化后的选择排序交换元素的次数
*/
public
class
SelectSort2 {
public
static
void
main(String[]
args
) {
int
[]
arr1
=
getArray
();
System.
out
.println(
"
排序前
:"
);
print
(
arr1
);
int
[]
arr2
=
copy
(
arr1
);
System.
out
.println(
"
排序前
:"
);
print
(
arr2
);
System.
out
.println(
"-----------"
);
selectSort
(
arr1
);
System.
out
.println(
"
排序后
:"
);
print
(
arr1
);
System.
out
.println(
"-----------"
);
selectSort2
(
arr2
);
System.
out
.println(
"
排序后
:"
);
print
(
arr2
);
}
//
产生一个
1000
个元素的数组
public
static
int
[] getArray(){
int
[]
arr
=
new
int
[1000];
for
(
int
i
= 0;
i
<
arr
.
length
;
i
++){
arr
[
i
] = (
int
)(Math.
random
()*1000);
}
return
arr
;
}
//
数组拷贝
public
static
int
[] copy(
int
[]
src
){
int
[]
dest
=
new
int
[
src
.
length
];
//
使用系统类的数组拷贝方法
System.
arraycopy
(
src
, 0,
dest
, 0,
src
.
length
);