所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。排序算法,就是如何使得记录按照要求排列的方法。排序算法在很多领域得到相当地重视,尤其是在大量数据的处理方面。一个优秀的算法可以节省大量的资源。在各个领域中考虑到数据的各种限制和规范,要得到一个符合实际的优秀算法,得经过大量的推理和分析。
分别使用插入排序法,冒泡排序法,选择排序法,快速排序法,将下面数组中的值进行按照从小到大的顺序进行排序操作。
1
|
$arr
(12,43,57,32,51,76,36,91,28,46,40);
|
1、插入排序法
分析:既定前面数字已经排好顺序,现在要把第n个数字插入到前面有序的数组中,使得这n个数字也是有序的放入其中,如此反复循环直至全部排好顺序。
具体代码实现如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
$arr
(12,43,57,32,51,76,36,91,28,46,40);
function
insertSort(
$arr
) {
$len
=
count
(
$arr
);
for
(
$i
=1,
$i
<
$len
;
$i
++) {
$tmp
=
$arr
[
$i
];
for
(
$j
=
$i
-1;
$j
>=0;
$j
--) {
if
(
$tmp
<
$arr
[
$j
]) {
//比较大小当数字小时交换位置,将后面的数字与前面的数字进行互换操作
$arr
[
$j
+1] =
$arr
[
$j
];
$arr
[
$j
] =
$tmp
;
}
else
{
//不需要,直接跳过
break
;
}
}
}
return
$arr
;
}
|
2、冒泡排序法
分析:从前往后对相邻的两个数字依次进行比较调整,让较大的数字往下沉,让较小的数字往上升,即每相邻的数字进行对比排序,顺序不符合时将其调换位置。
具体代码实现如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
$arr
(12,43,57,32,51,76,36,91,28,46,40);
function
bubbleSort(
$arr
)
{
$len
=
count
(
$arr
);
for
(
$i
=1;
$i
<
$len
;
$i
++)
{
//循环比较次数
for
(
$k
=0;
$k
<
$len
-
$i
;
$k
++)
{
if
(
$arr
[
$k
]>
$arr
[
$k
+1])
{
$tmp
=
$arr
[
$k
+1];
$arr
[
$k
+1]=
$arr
[
$k
];
$arr
[
$k
]=
$tmp
;
}
}
}
return
$arr
;
}
|
3、选择排序法
分析:选出最小的一个数字与第一个位置数字交换,之后再剩余的数当中再次找到最小的数字与第二个位置交换,依此循环到倒数第二个数字和最后一个数字比较结束为止。
具体代码实现如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
$arr
(12,43,57,32,51,76,36,91,28,46,40);
function
selectSort(
$arr
) {
$len
=
count
(
$arr
);
for
(
$i
=0;
$i
<
$len
-1;
$i
++) {
//假设最小值的位置
$p
=
$i
;
for
(
$j
=
$i
+1;
$j
<
$len
;
$j
++) {
//$arr[$p] 已知的最小值
if
(
$arr
[
$p
] >
$arr
[
$j
]) {
//比较发现更小的记录下最小值的位置,并且在下次比较时采用已知的最小值进行比较。
$p
=
$j
;
}
}
//确定当前最小值的位置,保存到$p中。如果发现最小值的位置与当前假设的位置$i不同,则位置互换即可。
if
(
$p
!=
$i
) {
$tmp
=
$arr
[
$p
];
$arr
[
$p
] =
$arr
[
$i
];
$arr
[
$i
] =
$tmp
;
}
}
return
$arr
;
}
|
4、快速排序法
分析:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
具体代码实现如下:
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
|
$arr
(12,43,57,32,51,76,36,91,28,46,40);
function
quickSort(
$arr
) {
//判断是否继续进行
$length
=
count
(
$arr
);
if
(
$length
<= 1) {
return
$arr
;
}
//选择第一个数字作为基准
$base_num
=
$arr
[0];
//遍历除了基准外的所有数字,按照大小关系放入两个数组内,之后初始化两个数组
$left_array
=
array
();
//小于基准
$right_array
=
array
();
//大于基准
for
(
$i
=1;
$i
<
$length
;
$i
++) {
if
(
$base_num
>
$arr
[
$i
]) {
//放入左边数组
$left_array
[] =
$arr
[
$i
];
}
else
{
//放入右边数组
$right_array
[] =
$arr
[
$i
];
}
}
//分别对两数组进行相同的排序处理方式递归
$left_array
= quick_sort(
$left_array
);
$right_array
= quick_sort(
$right_array
);
//合并数组
return
array_merge
(
$left_array
,
array
(
$base_num
),
$right_array
);
}
|