选择排序

参考链接

基本思想

选择排序和插入排序类似,都将数据分为有序区和无序区,不同的是选择排序是从无序区选一个最小的元素直接放到有序区的最后。

设数组为a[0…n-1]。

  • 初始时,数组全为无序区为a[0..n-1]。令i=0
  • 在无序区a[i…n-1]中选取一个最小的元素,将其与a[i]交换。交换之后a[0…i]就形成了一个有序区。
  • i++并重复第二步直到i==n-1。排序完成。

算法的实现

extension Array where Element: Comparable {
    mutating func selectSort() {
        for i in 0 ..< count {
            var minIndex = i
            for j in (i + 1) ..< count where self[j] < self[minIndex] {
                minIndex = j
            }

            if minIndex != i {
                swapAt(i, minIndex)
            }
        }
    }
}

改进(二元选择排序)

简单选择排序,每趟循环只能确定一个元素排序后的定位。我们可以考虑改进为每趟循环确定两个元素(当前趟最大和最小记录)的位置,从而减少排序所需的循环次数。

改进后对n个数据进行排序,最多只需进行n/2趟循环即可。具体实现如下:

extension Array where Element: Comparable {
    mutating func selectSortBetter() {
        var next, end, minIndex, maxIndex: Int
        /*
         1. 整个排序过程共进行n/2趟
         2. 每次循环,会找出最小和最大的元素,与开始和结束位置的元素交换
         */
        for begin in 0 ..< count / 2 {
            end = count - 1 - begin
            minIndex = begin
            maxIndex = begin

            next = begin + 1
            while next <= end {
                if self[next] < self[minIndex] {
                    minIndex = next
                    continue
                }

                if self[next] > self[maxIndex] {
                    maxIndex = next
                }
                next += 1
            }

            /*
             先放最小的元素
             因为会将最小元素和第一个元素交换
             所以如果第一个元素就是最大的元素,那么max应该指向交换后的索引
             */
            if minIndex != begin {
                swapAt(begin, minIndex)
                if maxIndex == begin {
                    maxIndex = minIndex
                }
            }

            if maxIndex != end {
                swapAt(end, maxIndex)
            }
        }
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 排序的基本概念 在计算机程序开发过程中,经常需要一组数据元素(或记录)按某个关键字进行排序,排序完成的序列可用于快...
    Jack921阅读 1,566评论 1 4
  • 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    蚁前阅读 5,298评论 0 52
  • 概述:排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    每天刷两次牙阅读 3,819评论 0 15
  • 一、 单项选择题(共71题) 对n个元素的序列进行冒泡排序时,最少的比较次数是( )。A. n ...
    貝影阅读 9,419评论 0 10
  • 【一日一评vol.11】Pretty Pimpin - Kurt Vile 【单曲】★★★★★ 副歌的cause ...
    避雷殝阅读 371评论 1 0

友情链接更多精彩内容