冒泡排序
什么是排序?
释义:将一组数据进行 依照指定的规则 进行排列,就是排序。
冒泡排序核心思想 1.让前面的数字和后面的相比较,如果前面的数比后面的数字大,则交换位置;
2.通过一次大循环的比较,可以确定一个数的位置
冒泡排序的规律 1.发现大循环比较的次数为数组的个数-1
2.每次循环的比较次数,是在依次-1的
冒泡排序优化的思路第一步:首先在开头添加一个识别变量;
第二步:然后只要进行过if判断的数据就把$flag设置为1;
第三步:当判断完所有的数据,如果 $flag==0; 就说明就是按照规则排序的,直接break结束语句的执行,否则 $flag == 1 就说明进行过数据交换,重新赋值为0;
#冒泡排序由小到大排序简单案例
$arr=[2,5,-1,4,100,43434];
function test(&$arr){
//先确定元素的个数
$size=count($arr);
for($i=0;$i<$size-1;$i++){
//这个for循环是确定大循环的次数
// echo '<br/>循环的次数'.$i;
for ($j=0;$j<$size-1-$i;$j++){
#这个for循环是让前面的数和后面的数进行比较,如果后面的数大,则交换数据
if ($arr[$j] > $arr[$j+1]){
//交换数据,先定义一个中间变量
$temp = $arr[$j]; #把其中一个要比较的数字赋值给一个中间变量
$arr[$j] = $arr[$j+1];
$arr[$j+1]=$temp;
}
}
}
}
test($arr);
echo "<pre/>";
print_r($arr);
#冒泡排序由大到小排序简单案例
$niu=[100,1000,200,123,10];
/*
思路分析:第一步 确定大循环的次数,次数恰巧是元素的个数-1
第二步 把第一个元素和第二个元素相比较,要是小于第二个数 就互相交换
*/
function ceshi(&$niu){
//确定元素的大小
$size=count($niu);
for ($i=0;$i<$size-1;$i++){
for ($j=0;$j<$size-1-$i;$j++){
if ($niu[$j]<$niu[$j+1]){
#如果第一个数小于第二个数,就把第一个数赋值给第二个数
$a=$niu[$j];
$niu[$j]=$niu[$j+1];
$niu[$j+1]=$a;
}
}
}
}
ceshi($niu);
echo "<pre/>";
print_r($niu);
#冒泡排序代码优化
$arr=range(1,100000);//随机生成一个区间的数组
function test(&$arr){
$flag=0;//这个变量是判断两个数据有没有进行交换过。
//先确定元素的个数
$size=count($arr);
for($i=0;$i<$size-1;$i++){
//这个for循环是确定大循环的次数
// echo '<br/>循环的次数'.$i;
for ($j=0;$j<$size-1-$i;$j++){
#这个for循环是让前面的数和后面的数进行比较,如果后面的数大,则交换数据
if ($arr[$j] > $arr[$j+1]){
//交换数据,先定义一个中间变量
$temp = $arr[$j]; #把其中一个要比较的数字赋值给一个中间变量
$arr[$j] = $arr[$j+1];
$arr[$j+1]=$temp;
$flag=1;
}
}
if ($flag==0){
//说明数组没有进行一次交换,则该数组已经是一个从小到大顺序,因此结束排序;
break;
}else{
#如果flag为1,则说明数组进行过数据交换,则该数组还不是一个从小到大的顺序,因此从新设置为0;
$flag=1;
}
}
}
echo '<br>'.date('H:i:s'); #测试代码执行的时长
test($arr);
echo '<br/>'.date('H:i:s');
echo "<pre/>";
print_r($arr);
选择排序法
核心思想:
第一次 就从R[0]~R[n-1]的数组中选择最小的值放在第一位;
第二次就从R[1]~R[n-1]的数组中选择最小的值放在第二位;
第三次就从R[2]~R[n-1]的数组中选择最小的值放在第三位;
依次类推。。。。。。
/*题目:一群母牛的颜值为 10分 34分 19分 100分 80分,请用选择排序的方式由高到低进行排序
*/
/*解题思路
第一步:先确定要母牛的个数,然后就能确定要循环比较的次数;
第二步:假设数组的第一个值就是最大值,然后存入一个变量;同时把第一个值的坐标也用变量保存下来;
第三步:开始真正的循坏比较了,找到真正的最大值,然后交换;
第四步:如果假设的值小于数组的第二个值,两个就要互换位置了,并且重新设置最大值以及下坐标
第五步:如果下坐标的值就等于假定的值,就不用交换,否则就交换
第五步:进行数据交换
*/
$arr=[10,34,19,100,80];
function test(&$arr){
//确定母牛个数
$arr_size=count($arr);
//for循环确定要大循环的次数
for ($i=0;$i<$arr_size-1;$i++){
//假设第一个就是最大值
$max_num=$arr[$i];
//最大值的下坐标
$max_val_index=$i;
//这一步骤就是找出真正的最大值
for($j=$i+1;$j<$arr_size;$j++){
if ($max_num<$arr[$j]){
//就开始互换位置
$max_num=$arr[$j];
$max_val_index=$j;
}
}
if ($max_val_index !=$i){
//开始真正交换
$arr[$max_val_index]=$arr[$i];
$arr[$i]=$max_num;
}
}
}
test($arr);
echo '<pre>';
print_r($arr);