• 排序学习之---冒泡排序


    原理:对一组数据,比较相邻数据的大小,将值小数据在前面,值大的数据放在后面。   (以下都是升序排列,即从小到大排列)

      举例说明: $arr = array(6, 3, 8, 2, 9, 1);

       $arr 有6个数据,按照两两比较大小如下,注意  比较轮数 和 每轮比较次数 

      第一轮排序:

        第一次比较  6和3比较 结果:3    6   8   2   9   1     

        第二次比较  6和3比较 结果:3    6   8   2   9   1 

        第三次比较  8和2比较 结果:3    6   2   8   9   1 

        第四次比较  8和9比较 结果:3    6   2   8   9   1 

        第五次比较  9和1比较 结果:3    6   2   8   1   9 

      第一轮比较总结:1.排序第1轮、比较5次,没有获得从小到大的排序   2.因为每次比较都是大数往后靠,所以比较完成后,可以确定大数排在最后(9 已经冒泡冒出来了,下轮比较可以不用比较了 )

      第二轮排序:

        第一次比较  3和6比较 结果:3    6   2   8   1   9     

        第二次比较  6和2比较 结果:3    2   6   8   1   9 

        第三次比较  6和8比较 结果:3    2   6   8   1   9 

        第四次比较  8和1比较 结果:3    2   6   1   8   9 

      第二轮比较总结:1.排序第2轮、比较4次,没有获得从小到大的排序   2.冒泡出了 8,下轮不用比较8 了

      

      第三轮排序:

        第一次比较  3和2比较 结果:2    3   6   1   8   9     

        第二次比较  3和6比较 结果:2    3   6   1   8   9 

        第三次比较  6和1比较 结果:2    3   1   6   8   9 

      第三轮比较总结:1.排序第3轮、比较3次,没有获得从小到大的排序   2.冒泡出了 6,下轮不用比较6 了

      第四轮排序:

        第一次比较  2和3比较 结果:2    3   1   6   8   9     

        第二次比较  3和1比较 结果:2    1   3   6   8   9 

      第四轮比较总结:1.排序第4轮、比较2次,没有获得从小到大的排序   2.冒泡出了 3,下轮不用比较3 了

      第五轮排序:

        第一次比较  2和1比较 结果:1   2   3   6   8   9     

      第五轮比较总结:1.排序第5轮、比较1次,没有获得从小到大的排序   2.冒泡出了 2,由于还剩一个1,不用再比较了,至此通过5轮排序,完成整个排序。

      通过以上五轮排序,若干次比较,我们有理由推断出一个结论:

      对于一个长度为N的数组,我们需要排序 N-1 轮,每 i 轮 要比较 N-i 次。对此我们可以用双重循环语句,外层循环控制循环轮次,内层循环控制每轮的比较次数。

    python版本

    # *_*coding:utf-8 *_*
    #对于一个长度为N的数组,我们需要排序 N-1 轮,每 i 轮 要比较 N-i 次。对此我们可以用双重循环语句,外层循环控制循环轮次,内层循环控制每轮的比较次数
    def bubble_sort(sort_list,sort='asc'):
        if len(sort_list) <= 0:
            return []
        count = len(sort_list)
        sorted_list = sort_list
        for i in range(0,count-1):
            print('第%d趟排序:' % (i + 1))
            for j in range(0,count-i-1):
                if sorted_list[j] > sorted_list[j + 1]  :
                    sorted_list[j], sorted_list[j + 1] = sorted_list[j + 1], sorted_list[j]
                print(sorted_list)
    
    
    
    list = [3,4,2,6,5,9]
    bubble_sort(list)
    

    php版本

    <?php
    /**
     * Created by PhpStorm.
     * User: mac
     * Date: 2018/10/9
     * Time: 22:39
     */
    
    /**
     * @author brady
     * @desc   冒泡排序
     * @param $arr 待排序的数组
     * @param string $sort 排序方式 asc 升序  desc降序
     * @time  2018/10/9
     * 一共要外层循环n-1次 内层循环每次外层循环一次 最后一个会不需要排序 n-i-1次
     */
    function bubble_sort($arr,$sort='asc')
    {
        $count = count($arr);
    
        for($i = 0; $i < $count-1; $i++){
            for($j = 0; $j< $count - 1 - $i; $j++){
                $tmp = '';
                if($sort == 'asc'){
                    if($arr[$j] > $arr[$j+1]){
                        $tmp = $arr[$j];
                        $arr[$j] = $arr[$j+1];
                        $arr[$j+1] = $tmp;
    
                    }
                } else {
                    if($arr[$j] < $arr[$j+1]){
                        $tmp = $arr[$j];
                        $arr[$j] = $arr[$j+1];
                        $arr[$j+1] = $tmp;
    
                    }
                }
    
                echo "第".($i+1)."轮循环 后数组排序为:".json_encode($arr)."<br>";
            }
            echo "<hr>";
        }
    
        return $arr;
    
    }
    /**
     * @author brady
     * @desc   冒泡排序
     * @param $arr 待排序的数组
     * @param string $sort 排序方式 asc 升序  desc降序
     * @time  2018/10/9
     * 从最后一个进行冒泡 把最大的冒泡到最左边  第一次 冒泡后 第二次 最左边的一个已经合格 内层循环少一次 所以为 只循环 $j>$i
     */
    function bubble_sort2($arr,$sort='asc')
    {
        $count = count($arr);
    
        for($i = 0; $i < $count-1; $i++){
            for($j = $count - 1; $j> $i ; $j--){
    
                $tmp = '';
                if($sort == 'desc'){
                    if($arr[$j] > $arr[$j-1]){
                        $tmp = $arr[$j];
                        $arr[$j] = $arr[$j-1];
                        $arr[$j-1] = $tmp;
    
                    }
                } else {
                    if($arr[$j] < $arr[$j-1]){
                        $tmp = $arr[$j];
                        $arr[$j] = $arr[$j-1];
                        $arr[$j-1] = $tmp;
    
                    }
                }
    
                echo "第".($i+1)."轮循环 后数组排序为:".json_encode($arr)."<br>";
            }
            echo "<hr>";
        }
    
        return $arr;
    
    }
    
    
    $arr = [9,6,3,7,5,4];
    $res = bubble_sort2($arr,'asc');
    echo "<pre>";
    print_r($res);
    echo "</pre>";
    
    
    $b=[1,2,3,7,5,4];
    $len=count($b);//6
    for($k=1;$k<$len;$k++)
    {
        for($j=0;$j<$len-$k;$j++){
            if($b[$j]>$b[$j+1]){
                $temp =$b[$j+1];
                $b[$j+1] =$b[$j] ;
                $b[$j] = $temp;
            }
    
            echo "第".($k)."轮循环 后数组排序为:".json_encode($b)."<br>";
        }
        echo "<hr>";
    
    }
    
    print_r($b);

  • 相关阅读:
    获取其他线程的数据用 queue, 多进程Q
    self: 限制并发量asyncio
    asyncio 中给running 的loop 动态添加 Future Task
    雾里看花之 Python Asyncio
    python协程之动态添加任务
    异步IO( asyncio) 协程
    加快phpstorm、rubymine、pycharm系列IDE运行速度的方法
    scrapy 'fcntl' has no attribute 'F_GETFD
    sitemap index
    Django模板系统 运算
  • 原文地址:https://www.cnblogs.com/brady-wang/p/9762086.html
Copyright © 2020-2023  润新知