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)); ?>
|