美文网首页力扣精解
数组-选择排序

数组-选择排序

作者: coenen | 来源:发表于2021-08-10 07:35 被阅读0次
    采用选择排序方式对数组进行排序

    选择排序百科:选择排序(Selection sort)是一种简单直观的排序算法

    摘一个示例做个说明.
    示例 1:
    输入: [0,5,9,3,12,7]
    输出: [0,3,5,7,9,12]
    
    算法原理:
    1. 第一次从待排序的数据中选出最小或者最大的一个元素,放在数组的起始位置.然后再从剩下待排序数据中继续寻找相应数据,放到已排序的末尾.直到结束.
    2. 算法演示 选择排序演示.gif
    算法分析:
    1. 时间复杂度
      选择排序的交换操作介于 0 和 (n - 1)次之间。选择排序的比较操作为 n (n - 1) / 2 次之间。选择排序的赋值操作介于 0 和 3 (n - 1) 次之间。比较次数O(n^2),比较次数与关键字的初始状态无关,总的比较次数N=(n-1)+(n-2)+...+1=n*(n-1)/2。交换次数O(n),最好情况是,已经有序,交换0次;最坏情况交换n-1次,逆序交换n/2次。
    2. 算法稳定性
      选择排序是给每个位置选择当前元素最小的,比如给第一个位置选择最小的,在剩余元素里面给第二个元素选择第二小的,依次类推,直到第n-1个元素,第n个元素不用选择了,因为只剩下它一个最大的元素了。那么,在一趟选择,如果一个元素比当前元素小,而该小的元素又出现在一个和当前元素相等的元素后面,那么交换后稳定性就被破坏了。举个例子,序列5 8 5 2 9,我们知道第一遍选择第1个元素5会和2交换,那么原序列中两个5的相对前后顺序就被破坏了。
      综上,选择排序是一种不稳定排序算法.

    代码实现-Swift版本:

    func selectionSort(nums: inout [Int]){
        var minIndex: Int// 先找最小的进行交换排序
        for i in 0 ..< nums.count - 1 {
            minIndex = i
            for j in i + 1 ..< nums.count{
                // 循环遍历未排序的数据,找出最小值
                if nums[minIndex] > nums[j] {
                    minIndex = j
                }
            }
            nums.swapAt(i, minIndex)//交换最小值和当前值
        }
    }
    

    测试用例:

    var nums = [3,44,38,5,47,15,36,26,27,2,46,4,19,50,48]

    参考:

    考察要点:

    • 数组
    • 排序

    相关文章

      网友评论

        本文标题:数组-选择排序

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