数组排序
1. 什么是数组排序
????????数组排序指的是数组中的元素按从大到小或者从小到大的顺序依次排列。因此数组排序分为升序排列和降序排列两种
2. 冒泡排序
解释说明
????????每一次遍历数组,都能从数组的元素中获取一个最值(最大值、最小值)。
????????在每一次遍历数组时,比较数组中相邻两个元素的大小,根据排序需要交换元素的位置。
示例
????????将数列10,70,55,80,25,60
进行降序排列
分析
????????a. 第
1
次遍历:从
0
开始,到数组的末尾,依次比较相邻两个元素的大小,如果前一个元素比后一个元素小,则交换他们的位置。此时交换完了的序列为:70,55,80,25,60,10
????????
????????b.第2
次遍历:从
0
开始,到数组的长度
-1
,依次比较相邻两个元素的大小,如果前一个元素比后一个元素小,则交换他们的位置。此时交换完了的序列为:70,80,55,60,25
????????
????????c.第3
次遍历:从
0
开始,到数组的长度
-2
,依次比较相邻两个元素的大小,如果前一个元素比后一个元素小,则交换他们的位置。此时交换完了的序列为:80,70,60,55
\
????????d.第
4
次遍历:从
0
开始,到数组的长度
-3
,依次比较相邻两个元素的大小,如果前一个元素比后一个元素小,则交换他们的位置。此时交换完了的序列为:80,70,60
????????e.第
5
次遍历:从
0
开始,到数组的长度
-4
,依次比较相邻两个元素的大小,如果前一个元素比后一个元素小,则交换他们的位置。此时交换完了的序列为:80,70
????????f.第
6
次遍历:从
0
开始,到数组的长度
-5
,依次比较相邻两个元素的大小,如果前一个元素比后一个元素小,则交换他们的位置。此时交换完了的序列为:80
代码实现
public static
void
main
(
String
[]
args
) {
????????int
[]
numbers
=
{
10
,
70
,
55
,
80
,
25
,
60
};
????????for
(
int
i
=
0
;
i
<
numbers
.
length
;
i
++
){
//
控制遍历次数
????????????????for
(
int
j
=
0
;
j
<
numbers
.
length
-
i
-
1
;
j
++
){
????????????????????????if
(
numbers
[
j
]
<
numbers
[
j
+
1
]){
????????????????????????????????int
temp
=
numbers
[
j
];
//
使用临时变量保存其中一个元素的值
????????????????????????????????numbers
[
j
]
=
numbers
[
j
+
1
];
????????????????????????????????numbers
[
j
+
1
]
=
temp
;
????????????????????????}
????????????????}
????????}
????????for
(
int
i
=
0
;
i
<
numbers
.
length
;
i
++
){
????????????????System
.
out
.
println
(
numbers
[
i
]);
????????}
}
3. 工具类的排序操作
语法
Arrays
.
sort
(
数组名
);
//
将数组中的元素进行升序排列
Arrays
.
toString
(
数组名
);
//
将数组中的元素组装为一个字符串
示例
public static
void
main
(
String
[]
args
) {
????????//字符能够排序,排序是按照字典的顺序进行排序
????????char
[]
chars
=
{
'c'
,
'a'
,
'g'
,
'p'
,
'f'
};
????????Arrays
.
sort
(
chars
);
//
对数组进行升序排列
????????System
.
out
.
println
(
Arrays
.
toString
(
chars
));
????????String
[]
names
=
{
"zhangsan"
,
"zhangsi"
,
"lisi"
,
"lisan"
,
"lisiabc"
,
"lisib"
};
????????Arrays
.
sort
(
names
);
????????System
.
out
.
println
(
Arrays
.
toString
(
names
));
}
4. 二分查找法
解释说明
????????二分查找法又称为折半查找,顾名思义,每一次都会将数组从中间分为两个区间,利用中间元素与要查找的目标元素比较大小。从而确定目标元素所处的区间。依次往复执行,直到找到目标元素为止。
二分查找只适用于已经排好序的数组
案例
从数列
95,93,87,86,79,72,60,53
中快速找出元素
60
所处位置
分析
????????a. 首先将数组从中间位置一分为二,然后利用中间位置的元素与
60
进行比较,从而确定
60
所处的目标区间

????????
????????b. 再将目标区间从中间位置一分为二,然后利用中间位置的元素与60
进行比较,从而确定
60
所处的目标区间

????????c. 再将目标区间从中间位置一分为二,然后利用中间位置的元素与
60
进行比较,从而确定
60
所处的目标区间

代码实现
public static
void
main
(
String
[]
args
) {
????????int
[]
numbers
=
{
95
,
93
,
87
,
86
,
79
,
72
,
60
,
53
};
????????int
target
=
60
;
//
要查找的目标元素
????????int
start
=
0
;
//
区间取值的最小值
????????int
end
=
numbers
.
length
-
1
;
//
区间取值的最大值
????????while
(
start
<
end
){
//
开始位置比结束位置小,就一直不停的循环
????????????????int
middle
=
(
start
+
end
)
/
2
;
????????????????if
(
numbers
[
middle
]
>
60
){
//
说明目标元素在后半区间
????????????????????????start
=
middle
+
1
;
//
改变区间开始的位置
????????????????}
else if
(
numbers
[
middle
]
<
60
){
//
说明目标元素在前半区间
????????????????????????end
=
middle
-
1
;
//
改变区间结束的位置
????????????????}
else
{
????????????????????????System
.
out
.
println
(
"
目标元素
"
+
target
+
"
所处位置:
"
+
middle
);
????????????????????????break
;
????????????????}
????????}
}