排序算法02:选择排序

作者: 梦中人在梦中 | 来源:发表于2017-04-22 19:47 被阅读19次

算法介绍

首先,从[0,len]中找到数组中最小的元素,让它与第一个元素交换。接着从[1,len]中找出最小的元素,让它与第二个元素交换。循环往复,最终使得数组从小到大排序。

可视化效果:<a href="http://www.cs.usfca.edu/~galles/visualization/ComparisonSort.html" >这里</a>

Javascript实现

/**
 * Created by YiYing on 2017/4/22.
 */
(function (W) {

    function Selection(arr) {
        this.arr = arr;
    }

    /**
     * 选择排序算法实现
     */
    Selection.prototype.sort = function () {
        var len = this.arr.length;
        for(var i=0;i<len;i++){
            var min = i;
            //找出最小元素
            for(var j=i+1;j<len;j++){
                if(this.less(j,min)){
                    min = j;
                }
            }
            //把最小元素放到最前面
            this.exchange(i,min);
        }
    };

    /**
     * 判断m是否小于n
     * @param m
     * @param n
     */
    Selection.prototype.less = function (m,n) {
        //可根据不同的数据类型设置比对规则,比如json。这里适用于数字与字符串。
        return this.arr[m]<this.arr[n];
    };

    /**
     * 交换数组中m与n的位置
     * @param m
     * @param n
     */
    Selection.prototype.exchange = function (m,n) {
        var swap    = this.arr[m];
        this.arr[m] = this.arr[n];
        this.arr[n] = swap;
    };

    /**
     * 打印排序后的数组
     */
    Selection.prototype.show = function () {
        console.log(this.arr);
    };

    /**
     * 判断是否已排序
     * @returns {boolean}
     */
    Selection.prototype.isSorted = function () {
        var len = this.arr.length;
        for(var i=1;i<len;i++){
            if(this.less(i,i-1)){
                return false;
            }
        }
        return true;
    };

    W.Selection = Selection;
})(window);

//测试代码
(function () {
    var arr = [4,5,6,0,3,5,21,7,9,0,1];
    var selection = new Selection(arr);
    console.log("排序前:"+selection.isSorted());
    selection.sort();
    console.log("排序后:"+selection.isSorted());
    selection.show();
})();

Java实现

package com.algs;

public class Selection {

  /**
   * 插入排序实现逻辑
   * @param arr
   */
  public static void sort(int[] arr){
    int len = arr.length;
        for (int i = 0; i < len; i++) {
            int min = i;
            for (int j = i+1; j < len; j++) {
                if (less(arr[j], arr[min])) min = j;
            }
            exchange(arr, i, min);
        }
  }

  /**
   * 比较m是否小于n
   * @param m
   * @param n
   * @return
   */
  private static boolean less(int m,int n) {
        return m < n;
    }

  /**
   * 交换m与n的位置
   * @param a
   * @param m
   * @param n
   */
  private static void exchange(int[] a, int m, int n) {
        int swap = a[m];
        a[m] = a[n];
        a[n] = swap;
    }

  public static void show(int[] a){
    for (int i = 0; i < a.length; i++) {
            System.out.print(a[i]+" ");
        }
  }

  public static void main(String[] args) {
    int[] arr = {4,5,6,0,3,5,21,7,9,0,1};
    Selection.sort(arr);
    Selection.show(arr);
  }
}

总结

  • 运行时间和输入无关。

为了找出最小元素而扫描一遍数组并不能为下一遍扫描提供信息。长度一致,一个有序的数组或值全部相当的数组和一个无序的数组排序所需的时间一致。

  • 数据移动是最少的。

一个长度为N的数组只需要N次交换即可完成排序。

  • 不稳定。

无法保证排序前与排序后重复元素的相对顺序一致。举例:序列[5,8,5,2,9],第一遍选择第1个元素5会和2交换,那么原序列中两个5的相对前后顺序就被破坏了,所以选择排序不是一个稳定的排序算法。

  • 原地排序。

  • 时间复杂度为:平方级别。

  • 空间复杂度为:常数级别。

GitHub:https://github.com/AlbertKnag/algs-practice

上一篇:<a href="http://muchstudy.com/2017/04/22/%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%9501%EF%BC%9A%E5%86%92%E6%B3%A1%E6%8E%92%E5%BA%8F/">排序算法01:冒泡排序</a>
下一篇:<a href="http://muchstudy.com/2017/04/22/%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%9503%EF%BC%9A%E6%8F%92%E5%85%A5%E6%8E%92%E5%BA%8F/ ">排序算法03:插入排序</a>

相关文章

  • 算法-选择排序

    算 法:选择排序算法时间复杂度: 选择排序算法概述 选择排序伪代码 选择排序实现 选择排序算法概述 排序算法有许...

  • 算法4:插入排序和选择排序算法的比较

    排序算法列表电梯: 选择排序算法:详见 《算法4》2.1 - 选择排序算法(Selection Sort), Py...

  • 图形化排序算法比较:快速排序、插入排序、选择排序、冒泡排序

    图形化排序算法比较:快速排序、插入排序、选择排序、冒泡排序 图形化排序算法比较:快速排序、插入排序、选择排序、冒泡排序

  • PHP常用算法

    基于选择的排序算法 常见的基于选择的排序算法有:冒泡排序、插入排序、选择排序、归并排序和快速排序,我们在选在排序算...

  • 算法and数据结构

    算法 冒泡排序 选择排序 计数排序

  • 基础排序算法总结

    排序算法分为内部排序和外部排序,而我们经常说的基础排序算法,都是内部排序算法。包括冒泡排序,选择排序,插入排序,快...

  • LeetCode大全

    1.常见排序算法: 常见的排序算法:冒泡排序、选择排序、插入排序、归并排序、快速排序、希尔排序、堆排序、计数排序、...

  • 《算法4》2.1 - 插入排序算法(Insertion Sort

    排序算法列表电梯: **选择排序算法:详见 Selection Sort ** 插入排序算法(Insertion ...

  • 排序算法

    排序算法 排序是最基本的算法之一,常见的排序算法有插入排序、希尔排序、选择排序、冒泡排序、堆排序、归并排序及快速排...

  • 面试算法知识梳理(12) - 二叉树算法第二部分

    面试算法代码知识梳理系列 面试算法知识梳理(1) - 排序算法 插入排序 希尔排序 选择排序 冒泡排序 计数排序 ...

网友评论

    本文标题:排序算法02:选择排序

    本文链接:https://www.haomeiwen.com/subject/jeoszttx.html