一、数组排序
1、排序分类
(1)、内部排序
指将需要处理的所有数据都加载到内部存储器中进行排序。包括(交换式排序法、选择式排序法和插入式排序法);
(2)、外部排序
数据量过大,无法全部加载到内存中,需要借助外部存储进行排序。包括(合并排序法和直接合并排序法);
2、交换式排序法
交换式排序属于内部排序法,是运用数据值比较后,依判断规则对数据位置进行交换,以达到排序的目的。
(1)、冒泡排序法(Bubble sort);[重要讲解]
(2)、快速排序法 (Quick sort);[重要讲解]
3、选择式排序法
选择式排序也属于内部排序法,是从欲排序的数据中,按指定的规则选出某一元素,经过和其他元素重整,再依原则交换位置后达到排序的目的。
(1)、选择排序法(Selection Sort);[重要讲解]
(2)、堆排序法(Heap Sort);
4、插入式排序法_ppt-29
插入式排序属于内部排序法,是对于欲排序的元素以插入的方式找寻该元素的适当位置,以达到排序的目的。
(1)、插入排序法(InsertionSort);[重要讲解]
(2)、谢耳排序法(shell sort);
(3)、二叉树排序法(Binary-tree sort);
5、冒泡排序法(Bubble sort)、快速排序法 (Quick sort)、选择排序法(Selection Sort)、插入排序法(InsertionSort) 举例说明
(1)、冒泡排序法(BubbleSort)
=举例> $array = [23,56,11,36,88];
=规则> 从小到大
=0>[23,56,11,36,88]
23,56 [23,56,11,36,88]
56,11 [23,11,56,36,88]
56,36 [23,11,36,56,88]
56,88 [23,11,36,56,88]
=1>[23,11,36,56]
23,11[11,23,36,56]
23,36[11,23,36,56]
36,56[11,23,36,56]
=2>[11,23,36]
11,23[11,23,36]
23,36[11,23,36]
=3>[11,23]
11,23[11,23]
(2)、快速排序法_ppt-33
快速排序(Quicksort)是对冒泡排序的一种改进。基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
(1)、举例说明
传说: 快速排序法,就是一分二,二分四,四分八的过程。
(3)、选择排序法(SelectionSort)
基本思想是:第一次从R[0]~R[n-1]中选取最小值,与R[0]交换,第二次从R[1]~R[n-1]中选取最小值,与R[1]交换,第三次从R[2]~R[n-1]中选取最小值,与R[2]交换,…,第i次从R[i-1]~R[n-1]中选取最小值,与R[i-1]交换,…, 第n-1次从R[n-2]~R[n-1]中选取最小值,与R[n-2]交换,总共通过n-1次,得到一个按排序码从小到大排列的有序序列。
/// 举例说明
(4)、插入排序法
基本思想是:把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。
(1)、举例说明
二、数组查找
1、查找分类
(1)、顺序查找;
(2)、二分查找;
1、排序分类
(1)、内部排序
指将需要处理的所有数据都加载到内部存储器中进行排序。包括(交换式排序法、选择式排序法和插入式排序法);
(2)、外部排序
数据量过大,无法全部加载到内存中,需要借助外部存储进行排序。包括(合并排序法和直接合并排序法);
2、交换式排序法
交换式排序属于内部排序法,是运用数据值比较后,依判断规则对数据位置进行交换,以达到排序的目的。
(1)、冒泡排序法(Bubble sort);[重要讲解]
(2)、快速排序法 (Quick sort);[重要讲解]
3、选择式排序法
选择式排序也属于内部排序法,是从欲排序的数据中,按指定的规则选出某一元素,经过和其他元素重整,再依原则交换位置后达到排序的目的。
(1)、选择排序法(Selection Sort);[重要讲解]
(2)、堆排序法(Heap Sort);
4、插入式排序法_ppt-29
插入式排序属于内部排序法,是对于欲排序的元素以插入的方式找寻该元素的适当位置,以达到排序的目的。
(1)、插入排序法(InsertionSort);[重要讲解]
(2)、谢耳排序法(shell sort);
(3)、二叉树排序法(Binary-tree sort);
5、冒泡排序法(Bubble sort)、快速排序法 (Quick sort)、选择排序法(Selection Sort)、插入排序法(InsertionSort) 举例说明
(1)、冒泡排序法(BubbleSort)
=举例> $array = [23,56,11,36,88];
=规则> 从小到大
=0>[23,56,11,36,88]
23,56 [23,56,11,36,88]
56,11 [23,11,56,36,88]
56,36 [23,11,36,56,88]
56,88 [23,11,36,56,88]
=1>[23,11,36,56]
23,11[11,23,36,56]
23,36[11,23,36,56]
36,56[11,23,36,56]
=2>[11,23,36]
11,23[11,23,36]
23,36[11,23,36]
=3>[11,23]
11,23[11,23]
// 冒泡排序函数
function mpSort(&$arr) {
$temp; // 临时变量: 用于两数组元素互相换值;
$flag = false; // 标识变量,标识数组是否已经排序好;
/*
* $i<count(array)-1: 假设数组元素个数为5,那意味着,只要排好4个,那最后一个自然会处于合适的位置,所以外层循环count(array)-1次;
*/
// 外层循环
for($i=0; $i<count(array)-1; $i++){
// 内层循环
/*
* $j<(count(array)-1)-$i: 为什么减去$i呢?因为$i表示已经排好的元素的个数;
*/
for($j=0; $j<(count(array)-1)-$i; $j++){
// 如果 前面元素 比 后面元素 大,则发生交换,这样,就能保证最大的元素在最右边;如果从大到小排序,则使最小的元素在最右边;
if($array[$j] > $array[$j+1]) {
$temp = $array[$j];
$array[$j] = $array[$j+1];
$array[$j+1] = $temp;
$flag = true;
}
}
if(!$flag){
// 不为真,则表明,没有排过序,那说明数组已经排好序;
break;
}
$flag = false;
}
}
(2)、快速排序法_ppt-33
快速排序(Quicksort)是对冒泡排序的一种改进。基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
(1)、举例说明
传说: 快速排序法,就是一分二,二分四,四分八的过程。
<?php
// 时间设置: 采用比较时间前后差值,来比较性能;
date_default_timezone_set('Asia/Shanghai');
$today = date('Y-n-d G:i:s');
echo $today;
// 数组
$array=array(-9, 78, 0, 23, -567, 89); // 共6个元素;
function quickSort($left, $right, &$array){
$l=$left; // 左边下标;0
$r=$right; // 右边下标;5
// 中间元素;
$pivot = $array[($left+$right)/2]; // 23;
// 临时变量
$temp=0;
while($l<$r){
while($array[$l]<$pivot) $l++; //1、l =1 78;2、l=3 23;
while($array[$r]>$pivot) $r--; //1、 r =4 -567; 2、r =3 23;
if($l>=$r) break;
// 交换值,从而保证左边元素小于中间值,右边大于中间值;结果:(-9, -567, 0, 23, 78, 89)
$temp=$array[$l];
$array[$l]=$array[$r];
$array[$r]=$temp;
if($array[$l]==$pivot) --$r;
if($array[$r]==$pivot) ++$l;
}
if($l==$r){
$l++; // l =4;
$r--; // r = 3;
}
if($left<$r) quickSort($left,$r,$array);
if($right>$l) quickSort($l,$right,$array);
}
// 调用函数 进行排序
quickSort(0,count($array)-1,$array);
print_r($array);
?>
(3)、选择排序法(SelectionSort)
基本思想是:第一次从R[0]~R[n-1]中选取最小值,与R[0]交换,第二次从R[1]~R[n-1]中选取最小值,与R[1]交换,第三次从R[2]~R[n-1]中选取最小值,与R[2]交换,…,第i次从R[i-1]~R[n-1]中选取最小值,与R[i-1]交换,…, 第n-1次从R[n-2]~R[n-1]中选取最小值,与R[n-2]交换,总共通过n-1次,得到一个按排序码从小到大排列的有序序列。
/// 举例说明
<?php
// 待排序数组
$arr = array(34,9,90,2,3,1,-12);
echo "排序前<br/>";
print_r($arr);
//选择排序法【特别说明,数组传递是值传递,不是地址传递(不是引用传递)!!!】
//如果要影响到函数外边的$arr,则需要 function selectSort(&$arr) 才可以,记得在参数前加&符号;
//调用时候,是 selectSort($arr)即可,即和普通的调用方法没有什么不一样;
function selectSort($arr){
echo "<br/>select sort 被调用<br/>";
// 临时变量
$temp;
/// 外层循环: 有n个元素,排好n-1个,那最后一个自然排好;
for($i=0;$i<count($arr)-1;$i++){
//假设当前$i对应的值是最小的;就是拿出每次大循环最前的元素,假设为最小值;
$min=$arr[$i]; // 最小值;
$minIndex=$i; // 下标值;
/// 内层循环: 查找最小值;从大循环第二个元素开始比较,如果发现比假设值小,则记住;
for($j=$i+1; $j<count($arr); $j++){
if($min>$arr[$j]){
//说明我们假设的最小值,不是最小值,所以记住当前值;
$min=$arr[$j];
//同时修改$minIndex
$minIndex=$j;
}
}
/// 交换值: 每次大循环结束,都会产生一个最小值;
//这时该轮的最小值和下标找到了,可以交换;
if($minIndex!=$i){ //如果相等,则无需交换;
$temp=$arr[$i];
$arr[$i]=$arr[$minIndex];
$arr[$minIndex]=$temp;
}
}
echo "<br/>在selectsort函数内排序后<br/>";
print_r($arr); //这里打印出排序后的顺序;
}
//测试
selectSort($arr);
echo "<br/>排序后<br/>";
print_r($arr);
?>
(4)、插入排序法
基本思想是:把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。
(1)、举例说明
<?php
// 待排序数组:从小到大;
$arr = array(34,9,90,2,3,1,-12);
echo "排序前<br/>";
print_r($arr);
// 引用传递
function insertSort(&$arr){
/// 从第二个开始比较
for($i=1;$i<count($arr);$i++){
// 插入值(比较值)
$insertVal=$arr[$i];
// 前一个下标,也是内层循环控制变量;
$index=$i-1;
while($index>=0&&$arr[$index]>$insertVal){
// 后一个等于前一个
$arr[$index+1]=$arr[$index];
$index--;
}
// 前一个等于插入值;
$arr[$index+1]=$insertVal;
}
}
insertSort($arr);
echo "<br/>排序后<br/>";
print_r($arr);
?>
二、数组查找
1、查找分类
(1)、顺序查找;
(2)、二分查找;
<?php
//二分查找: 前提是,数组是有序的;
$arr=array(56,90,123,234);
function binarySearch($l,$r,$arr,$findVal){
// 中间元素下标
$midIndex=round(($l+$r)/2);
if($l>$r){
echo "找不到";
return ;
}
if($arr[$midIndex]>$findVal){
binarySearch($l,$midIndex-1,$arr,$findVal);
}else if($arr[$midIndex]<$findVal){
binarySearch($midIndex+1,$r,$arr,$findVal);
}else{
echo "找到了,下标为".$midIndex;
}
}
binarySearch(0,count($arr)-1,$arr,2342);
?>