数据的几种经典排序

本文介绍了两种经典排序算法:冒泡排序和选择排序。冒泡排序通过不断比较并交换相邻元素实现排序,其核心思想包括特定的比较次数和交换规律。为优化冒泡排序,可以通过识别变量来提前结束排序过程。而选择排序则是每次从未排序的数组中找到最小值并放到已排序部分的末尾,以此类推完成排序。
摘要由CSDN通过智能技术生成

冒泡排序

什么是排序?
释义:将一组数据进行 依照指定的规则 进行排列,就是排序。

冒泡排序核心思想 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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值