查找和排序是程序员的基本功,今天刚看了韩顺平的视频,在网上也搜了几个关于这方面的代码,有两个感想。一个是同一个原理不同的人使用的方法不同,有的人写的干净整洁逻辑清楚,有的人写的则是很乱。第二个是都是在抄袭知识,不知道是谁在抄谁的,看着很烦,真想破口大骂,就是抄也超的有点水平,一个字不变原封不动,看着恶心。话不多说,反刍一下今天看得视频。
排序(sort)①冒泡排序
原理:字面上看如同水中的气泡一般一个一个的冒上来,在程序中也是一样的道理。以升序排列来说,我们会通过数组紧邻的两个数来依次比较,假如是一个长度为6的一维数组,那么我们两两比较的次数就是5.通过一轮比较,你会发现最大的数在比较的过程中被放到了最后,犹如一个气泡一样冒了出去。如此一来,最大的数就被确定了。同理,不难排出这个数组的大小顺序。
实现:我们一共有6个数第一轮我们需要比较5次,第二轮比较4次,第三轮比较3次,第四次比较2次,第五次比较一次。然后我们每次两两比较之后,都会少一个数参与比较。可见一轮既是一个for循环,多个for循环我们便可在外层抱一个for循环通过外层循环的变量值的改变改变每一轮参加比较的数的个数。从而实现将大数一次次的排到最后的想法。代码实现;
function sort1(&$arr)
{
$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;
}
}
}
}
后两种排序的方法并不如冒泡排序这般的生动,故此直说一下自己对代码的理解和原理的理解。
②选择排序
原理:选择排序就是从第一个元素开始,依次与后续的元素进行比较,还是以一个长度为6的一维数组说话,我们用一个元素和别的元素依次进行比较,如果对方小于原来的元素就进行交换,如此便把最小的元素固定下来。然后我们用第二个元素与剩下的元素进行比较,然后选出次小数。如此便可以把数组进行排序。
实现:我们依旧需要用到两个for()循环来实现,外层控制从第几个元素开始,内层则是用一个数依次和剩余数的比较,代码实现:
function sort2(&$arr){
$temp2=0;
for($i=0;$i<count($arr);$i++)
{
for($j=$i+1;$j<count($arr);$j++){
if($arr[$i]<$arr[$j]){
$temp2=$arr[$i];
$arr[$i]=$arr[$j];
$arr[$j]=$temp2;
}
}
}
}
③插入排序
原理:说白了就是说从第二个位置开始与前面数据做比较,如果小于前面的数据,那么我们首先要保存下来选定的元素,然后我们就要让前面的元素依次覆盖后边的元素,最后将选定的数据赋予最前面
实现:第一个for循环控制我们依次选择元素,第二个循环则是我们要让该元素依次同前面做比较然后将其放到该放的位置,主要的地方是需要交换的元素的后移,保证元素交换的成功。
代码实现:
function sort3(&$arr){
$temp3=0;
for($i=1;$i<count($arr);$i++){
$temp3=$arr[$i];
$j=$i-1;
while($j>=0&&$temp3<$arr[$j]){
$arr[$j+1]=$arr[$j];
$j--;
}
$arr[$j+1]=$temp3;
}
}
查找(search)
①顺序查找
原理很简单 ,就是从有序数组中依次与已知数据做比较,然后确定与该书想的数的下标值,由此来判断是否存在概数。
②二分法查找
原理:就是取数组中值,然后在左右两段中,采用递归的方式折半查找,直到找到与元素相等的值的时候便停止。
代码实现
function seach1(&$arr,$value,$left,$right){
error_reporting(0);
$mid=round(($right-$left)/2);
if($value<$arr[$mid]){
seach1(&$arr,$value,$left,$mid-1);
}else if($value<$arr[$mid]){
seach1(&$arr,$value,$mid+1,$right);
}else
{
echo "找到这个数了,这个数是第$mid"."个";
}
return;
}