力扣精解

数组-选择排序

2021-08-10  本文已影响0人  coenen
采用选择排序方式对数组进行排序

选择排序百科:选择排序(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]

参考:

考察要点:

上一篇下一篇

猜你喜欢

热点阅读