zoukankan      html  css  js  c++  java
  • 经典排序算法

    概述

    含义:直接从待排序数组里选择一个最小(或最大)的数字,每次都拿一个最小数字出来,顺序放入新数组,直到全部拿完。

    特点:以从小到大排序为例:N个元素,每一趟比较找出最小的那个元素,放在头部;经过N-1趟比较,排序就出来了。

    相当于每次从无序列表里找出一个最小数,放到左边;然后剩下的元素继续找出最小的,放在左边;直到排序完成。

    题目:给出无需数组 [4,3,1,2],要求按照从小到大排序。
    输出样例:

    1
    2
    3
    4
    

    排序过程:
    原数组:

    4,3,1,2
    
    1. 第1趟:
    3,4,1,2
    1,4,3,2
    1,4,3,2
    
    1. 第2趟:
      首元素已排好序,固定住。
    1,3,4,2
    1,2,4,3
    
    1. 第3趟:
      第2个元素已排好序,固定住。
    1,2,3,4
    

    实现:

    
    /**
     * 选择排序
     * 时间O(N^2),最好O(N^2);空间O(1)
     *
     * 1、每趟都从待排序数字里找出最小的数字,循环找的过程中不交换;这趟查找结束的时候如果发现有更小的则进行交换一次。
     * 2、第一趟开始的时候所有数字都是待排序。
     * 3、每趟里的每次都先将待排序的第一个数当做最小的。
     * @param $arr
     */
    function SelectionSort($arr)
    {
        $len = count($arr);
    
        //从第一个数开始,只需要N-1趟
        for ($i = 0; $i < $len - 1; $i ++) {
            $min = $i; //假设第一个数是最小的
            //从第2个数开始与第一个数比较
            for ($j = $i + 1; $j < $len; $j++) {
                if ($arr[$j] < $arr[$min]) { //如果当前数小于min所在的数
                    $min = $j; //发现了当前数是更小的数, min更新为当前数
                }
            }
    
            //比较min是否发生了变化,如果是则说明发现了更小的数,交换两数
            if ($min != $i) {
                $tmp = $arr[$i];
                $arr[$i] = $arr[$min];
                $arr[$min] = $tmp;
            }
        }
    
        return $arr;
    }
    

    参考:
    经典排序算法 - 选择排序Selection sort - kkun - 博客园
    http://www.cnblogs.com/kkun/archive/2011/11/23/2260281.html

  • 相关阅读:
    通过注册表获取计算机相关信息
    GetTickCount()函数
    SystemInfo获取计算机相关信息
    CriticalSection 临界区
    mysql慢查询问题
    mysql show processlist详解
    nginx及php版本号隐藏
    安装psutil模块报错&安装python-devel
    ubuntu ssh重启
    php-fpm配置优化
  • 原文地址:https://www.cnblogs.com/52fhy/p/7223667.html
Copyright © 2011-2022 走看看