1、数组的排序常用方法:

冒泡法、选择排序、插入排序、快速排序、

2、排序分类:

内部排序:指将需要处理的所有数据都加载到内部存储器中进行排序。

  内部排序又分为交换式(冒泡法、快速排序)、选择式、插入式排序法

  冒泡法、选择排序、插入排序、快速排序都属于内部排序


外部排序:数据量过大,无法全部加载到内存中,需要借助外部存储进行排序。

3、排序方法效率:

冒泡发<选择排序<插入排序

快速排序法速度很快,但效率并不高,占用空间太多

4、冒泡排序法实例:

冒泡排序的基本概念是:依次比较相邻的两个数,将小数放在前面,大数放在后面。即首先比较第1 个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。重复以上过程,仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再大于第2个数),将小数放前,大数放后,一直比较到最小数前的一对相邻数,将小数放前,大数放后,第二趟结束,在倒数第二个数中得到一个新的最小数。如此下去,直至最终完成排序。由于在排序过程中总是小数往前放,大数往后放,相当于气泡往上升,所以称作冒泡排序。

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
<?php
//echo "<br>";echo"<br>";echo "<br>";echo "<br>";

$arr =array(1,5,3,9,4,8,12,3,0,7,7.6,3.4,6);
//定义一个中间变量
$temp = 0;
//升序排序
for($i=0;$i<count($arr)-1;$i++)
{
for($j=0;$j<count($arr)-1-$i;$j++)
{ //说明前面的数比后面的大就要交换
if($arr[$j]>$arr[$j+1])
{
$temp= $arr[$j];
$arr[$j]= $arr[$j+1];
$arr[$j+1]= $temp;
}
}
}
//输出排序后数组
foreach($arr as $key=>$key_value)
{
echo'$arr['.$key."]=".$key_value."<br>";
}
?>

5、选择排序法实例详解:

选择排序法的思路:就是再第一次循环中,假设第一个数是最小的;然后跟第二个数比较,一直比到最后,找出最小值,然后把最小值跟第一个数的位置互换;再进行下一次循环,找出最小值跟第二个位置的数互换;一直循环数组的个数减去1次;数组就成了有序的了

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
30
31
32
33
34
35
36
37
<?php 
function selectSort(&$arr)
//注意此处要加地址传递符号;因为数组默认传递的是值,不是地址;若不地址传递,排序的是$arr而不是$asd。
{
//$arr = array(1,5,3,9,4,8,12,3,0,7,7.6,3.4,6);
//定义一个中间变量
$temp = 0;
//升序排序
for($i=0;$i<count($arr)-1;$i++)
{
//假设$i就是最小的数
$minVal=$arr[$i];
//记录我认为最小数的下标
$minIndex=$i;
for($j=$i+1;$j<count($arr);$j++)
{ //如果我认为的最小值不是最小
if($minVal>$arr[$j])
{
$minVal = $arr[$j];
$minIndex = $j;
}
}
//最后交换
$temp = $arr[$i];
$arr[$i] = $arr[$minIndex];
$arr[$minIndex] = $temp;
}
}
$asd = array(1,0,2,9,3,8,4,7,5,6);
//调用选择排序法的函数
selectSort($asd);
//输出排序后数组 升序显示
foreach($asd as $key=>$key_value)
{
echo '$asd['.$key."]=".$key_value."<br>";
}
?>

6、PHP快速排序法:

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
30
31
32
33
34
35
36
37
38
39
40
<?php
//快速排序法封装函数
function quick_Sort($array){
//先判断是否需要继续进行,若所要排序数组只有一个元素或没有元素则不需要排序
$len = count($array);
if($len <= 1)
{
return $array;
}
//如果所给数组元素大于1个,需要排序
//选择数组第一个元素作为标尺
$key = $array[0];
//初始化两个数组
$left_array = array();//小于标尺的
$right_array = array();//大于标尺的

//遍历所给数组除了标尺外的所有元素,按照大小关系放入两个数组内
for($i=1;$i<$len;$i++){
if($array[$i]<$key){
//如果数组元素小于标尺则将该元素放入左数组
$left_array[] = $array[$i];
}else{
//如果数组元素大于标尺则将该元素放入右数组
$right_array[] = $array[$i];
}
}
//再分别对 左数组 和 右数组进行相同的排序处理方式
//递归调用这个函数,并记录结果
$left_array = quick_Sort($left_array);
$right_array = quick_Sort($right_array);
//合并左数组 标尺 右数组
//array_merge() 函数把两个或多个数组合并为一个数组。
//如果键名有重复,后面的键名的值覆盖前面的键名的值。如果数组是数字索引的,则键名会以连续方式重新索引。
//语法 array_merge(array1,array2,array3...)
return array_merge($left_array,array($key),$right_array);
}

$sortarray = array(13,89,23,9,19,88,56,78,34,69,10,14);
print_r(quick_Sort($sortarray));
?>


本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!