打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Go 数据结构和算法篇(六):选择排序

今天

以下文章来源于xueyuanjun ,作者xueyuanjun

xueyuanjun学院君的订阅号,我会在这里持续更新优质全栈编程技术教程,包括但不限于 Golang、PHP、JavaScript 以及计算机底层技术。关注我,学习更多编程知识!

今天继续介绍排序算法 —— 选择排序。

实现原理

选择排序算法的实现思路有点类似插入排序,也分已排序区间和未排序区间。但是选择排序每次会从未排序区间中找到最小的元素,将其放到已排序区间的末尾。这样一来,当遍历完未排序区间,就意味着已经完成整个序列的排序了。图示如下:

选择排序图示

同样,可以在 VisuAlgo 上看动态图:https://visualgo.net/zh/sorting。

示例代码

选择排序的实现逻辑非常简单,对应的 Go 实现代码如下:

package main

import "fmt"

func selectionSort(nums []int) {
    if len(nums) <= 1 {
        return
    }
    // 已排序区间初始化为空,未排序区间初始化待排序切片
    for i := 0; i < len(nums); i++ {
        // 未排序区间最小值初始化为第一个元素
        min := i
        // 从未排序区间第二个元素开始遍历,直到找到最小值
        for j := i + 1; j < len(nums); j++ {
            if nums[j] < nums[min] {
                min = j
            }
        }
        // 将最小值与未排序区间第一个元素互换位置(等价于放到已排序区间最后一个位置)
        if min != i {
            nums[i],nums[min] = nums[min], nums[i]
        }
    }
}

func main() {
    nums := []int{45678321}
    selectionSort(nums)
    fmt.Println(nums)
}

由于传递到 selectionSort 函数的参数是 []int 类型的切片,而切片是引用类型,所以其实不必定义返回值,运行上述代码,打印结果如下:

表明排序算法可以正常工作。

性能分析

接下来,我们来看看选择排序的性能和稳定性:

  • 很显然,选择排序的时间复杂度也是 O(n2)

  • 由于不涉及额外的存储空间,所以是原地排序;

  • 由于涉及非相邻元素的位置交换,所以是不稳定的排序算法。

综合比较前面介绍的三种排序算法,时间复杂度都是一样的,也都是原地排序,但是选择排序是不稳定的排序算法,此外,插入排序和冒泡排序相比较的话,插入排序只需要执行一条语句,而冒泡排序需要三条,因此在同等条件下,或者数据量很大的情况下,插入排序性能是要略优于冒泡排序的,所以综合比较下来,三者的优先级是插入排序 > 冒泡排序 >> 选择排序。

不过三者的时间复杂度都是 O(n2),在数据量很大的情况下性能表现其实都不理想,还可以进一步进行优化,这就是我们接下来要介绍的归并排序和快速排序算法。

(本文完)



本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
BAT面试算法进阶(8)- 删除排序数组中的重复项
漫画算法:无序数组排序后的最大相邻差值
4分钟学会桶排序
七大排序算法总结
编程语言常见八大排序详解
快速排序(Python实现)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服