更多精彩内容,欢迎关注:

视频号
视频号

抖音
抖音

快手
快手

微博
微博

选择排序详解

文档

选择排序详解

选择排序是一种简单直观的排序算法,无论什么数据进去都是 O(n?) 的时间复杂度。所以用到它的时候,数据规模越小越好。唯一的好处可能就是不占用额外的内存空间。
推荐度:
导读选择排序是一种简单直观的排序算法,无论什么数据进去都是 O(n?) 的时间复杂度。所以用到它的时候,数据规模越小越好。唯一的好处可能就是不占用额外的内存空间。
.example-btn{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.example-btn:hover{color:#fff;background-color:#47a447;border-color:#398439}.example-btn:active{background-image:none}div.example{width:98%;color:#000;background-color:#f6f4f0;background-color:#d0e69c;background-color:#dcecb5;background-color:#e5eecc;margin:0 0 5px 0;padding:5px;border:1px solid #d4d4d4;background-image:-webkit-linear-gradient(#fff,#e5eecc 100px);background-image:linear-gradient(#fff,#e5eecc 100px)}div.example_code{line-height:1.4em;width:98%;background-color:#fff;padding:5px;border:1px solid #d4d4d4;font-size:110%;font-family:Menlo,Monaco,Consolas,"Andale Mono","lucida console","Courier New",monospace;word-break:break-all;word-wrap:break-word}div.example_result{background-color:#fff;padding:4px;border:1px solid #d4d4d4;width:98%}div.code{width:98%;border:1px solid #d4d4d4;background-color:#f6f4f0;color:#444;padding:5px;margin:0}div.code div{font-size:110%}div.code div,div.code p,div.example_code p{font-family:"courier new"}pre{margin:15px auto;font:12px/20px Menlo,Monaco,Consolas,"Andale Mono","lucida console","Courier New",monospace;white-space:pre-wrap;word-break:break-all;word-wrap:break-word;border:1px solid #ddd;border-left-width:4px;padding:10px 15px}

排序算法是《数据结构与算法》中最基本的算法之一。排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。以下是选择排序算法:

选择排序是一种简单直观的排序算法,无论什么数据进去都是 O(n?) 的时间复杂度。所以用到它的时候,数据规模越小越好。唯一的好处可能就是不占用额外的内存空间了吧。

1. 算法步骤

首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。

再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。

重复第二步,直到所有元素均排序完毕。

2. 动图演示

代码实现JavaScript 代码实现实例 function selectionSort(arr) {    var len = arr.length;    var minIndex, temp;    for (var i = 0; i < len - 1; i++) {        minIndex = i;        for (var j = i + 1; j < len; j++) {            if (arr[j] < arr[minIndex]) {     // 寻找最小的数                minIndex = j;                 // 将最小数的索引保存            }        }        temp = arr[i];        arr[i] = arr[minIndex];        arr[minIndex] = temp;    }    return arr;}Python 代码实现实例 def selectionSort(arr):    for i in range(len(arr) - 1):        # 记录最小数的索引        minIndex = i        for j in range(i + 1, len(arr)):            if arr[j] < arr[minIndex]:                minIndex = j        # i 不是最小数时,将 i 和最小数进行交换        if i != minIndex:            arr[i], arr[minIndex] = arr[minIndex], arr[i]    return arrGo 代码实现实例 func selectionSort(arr []int) []int {        length := len(arr)        for i := 0; i < length-1; i++ {                min := i                for j := i + 1; j < length; j++ {                        if arr[min] > arr[j] {                                min = j                        }                }                arr[i], arr[min] = arr[min], arr[i]        }        return arr}Java 代码实现实例 public class SelectionSort implements IArraySort {    @Override    public int[] sort(int[] sourceArray) throws Exception {        int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);        // 总共要经过 N-1 轮比较        for (int i = 0; i < arr.length - 1; i++) {            int min = i;            // 每轮需要比较的次数 N-i            for (int j = i + 1; j < arr.length; j++) {                if (arr[j] < arr[min]) {                    // 记录目前能找到的最小值元素的下标                    min = j;                }            }            // 将找到的最小值和i位置所在的值进行交换            if (i != min) {                int tmp = arr[i];                arr[i] = arr[min];                arr[min] = tmp;            }        }        return arr;    }}PHP 代码实现实例 function selectionSort($arr){    $len = count($arr);    for ($i = 0; $i < $len - 1; $i++) {        $minIndex = $i;        for ($j = $i + 1; $j < $len; $j++) {            if ($arr[$j] < $arr[$minIndex]) {                $minIndex = $j;            }        }        $temp = $arr[$i];        $arr[$i] = $arr[$minIndex];        $arr[$minIndex] = $temp;    }    return $arr;}C 语言实例 void swap(int *a,int *b) //交換兩個變數{    int temp = *a;    *a = *b;    *b = temp;}void selection_sort(int arr[], int len) {    int i,j;        for (i = 0 ; i < len - 1 ; i++)     {                int min = i;                for (j = i + 1; j < len; j++)     //走訪未排序的元素                        if (arr[j] < arr[min])    //找到目前最小值                                min = j;    //紀錄最小值                swap(&arr[min], &arr[i]);    //做交換        }}C++实例 template //整數或浮點數皆可使用,若要使用物件(class)時必須設定大於(>)的運算子功能void selection_sort(std::vector& arr) {        for (int i = 0; i < arr.size() - 1; i++) {                int min = i;                for (int j = i + 1; j < arr.size(); j++)                        if (arr[j] < arr[min])                                min = j;                std::swap(arr[i], arr[min]);        }}C#实例 static void selection_sort(T[] arr) where T : System.IComparable{//整數或浮點數皆可使用        int i, j, min, len = arr.Length;        T temp;        for (i = 0; i < len - 1; i++) {                min = i;                for (j = i + 1; j < len; j++)                        if (arr[min].CompareTo(arr[j]) > 0)                                min = j;                temp = arr[min];                arr[min] = arr[i];                arr[i] = temp;        }}Swift实例 import Foundation/// 选择排序////// - Parameter list: 需要排序的数组func selectionSort(_ list: inout [Int]) -> Void {    for j in 0.. list[i] {                minIndex = i            }        }        list.swapAt(j, minIndex)    }}

原文地址:https://github.com/hustcc/JS-Sorting-Algorithm/blob/master/2.selectionSort.md

参考地址:https://zh.wikipedia.org/wiki/%E9%80%89%E6%8B%A9%E6%8E%92%E5%BA%8F

以下是热心网友对选择排序算法的补充,仅供参考:

热心网友提供的补充1:

Kotlin 实现

class SelectionSort { 
    /** 
    * 拓展IntArray为他提供数据两个数交换位置的方法 
    * @param i 第一个数的下标 
    * @param j 第二个数的下标 
    */ 
    fun IntArray.swap(i:Int,j:Int){ 
        var temp=this[i] 
        this[i]=this[j] 
        this[j]=temp 
    } 
    fun selectionSort(array: IntArray):IntArray{
        for (i in array.indices){ 
            //假设最小值是i 
            var min=i 
            var j=i+1 
            while (j in array.indices){ 
                if (array[j]以上为选择排序算法详细介绍,插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等排序算法各有优缺点,用一张图概括: 

关于时间复杂度

平方阶 (O(n2)) 排序 各类简单排序:直接插入、直接选择和冒泡排序。

线性对数阶 (O(nlog2n)) 排序 快速排序、堆排序和归并排序;

O(n1+§)) 排序,§ 是介于 0 和 1 之间的常数。 希尔排序

线性阶 (O(n)) 排序 基数排序,此外还有桶、箱排序。

关于稳定性

稳定的排序算法:冒泡排序、插入排序、归并排序和基数排序。

不是稳定的排序算法:选择排序、快速排序、希尔排序、堆排序。

名词解释:

n:数据规模

k:"桶"的个数

In-place:占用常数内存,不占用额外内存

Out-place:占用额外内存

稳定性:排序后 2 个相等键值的顺序和排序之前它们的顺序相同

文档

选择排序详解

选择排序是一种简单直观的排序算法,无论什么数据进去都是 O(n?) 的时间复杂度。所以用到它的时候,数据规模越小越好。唯一的好处可能就是不占用额外的内存空间。
推荐度:
为你推荐
资讯专栏
热门视频
相关推荐
冒泡排序算法为什么问题 归并排序算法复杂度 希尔排序算法c语言代码 选择排序算法的基本思想 简述冒泡排序的过程 归并排序递归算法具体解析 希尔排序算法流程图 选择排序法的规则 冒泡排序的口诀 归并排序算法代码 希尔排序算法图解 简单选择排序例题 java实现冒泡排序 归并排序算法思想 希尔排序怎么取增量 选择排序法代码 冒泡排序算法复杂度 合并排序和归并排序 数据结构希尔排序例子 c语言选择法排序讲解 希尔排序代码 归并排序又叫什么排序 冒泡排序法代码 简单选择排序c语言 希尔排序原理 归并排序 java数组冒泡排序 直接选择排序举例子 数据结构希尔排序 归并排序原理 冒泡排序流程图表示 选择排序法流程图 希尔排序代码怎么解释 java归并排序 冒泡排序算法步骤 简单选择排序算法图解 希尔排序例子 归并排序图解 冒泡排序的原理 选择排序算法流程图
Top