选择排序No.16

一、基本介绍

  • 选择式排序也属于内部排序法,是从欲排序的数据中,按指定的规则选出某一元素,再依规定交换位置后达到 排序的目的。
  • 抽象理解
    1. 班里学生排队,个高的在最后个小在最前
    2. 首先在一个参差不齐的队列里
    3. 以第一个学生为准让他和后面的每一个学生进行比对
    4. 当发现有比自己个小的时候,自己出来让这个比自己个小的人和下一个比较(里层循环)
    5. 直到比完挑选出本轮最小个子的人,将他的位置和第一个学生的位置调换。
    6. 然后从以第二个学生为准让他和后面的每一个学生进行比对,直到比完位置(外层循环)

二、选择排序思想

  • 第一次从 arr[0]~arr[n-1]中选取最小值, 与 arr[0]交换
  • 第二次从 arr[1]~arr[n-1]中选取最小值,与 arr[1]交换
  • 第三次从 arr[2]~arr[n-1]中选取最小值,与 arr[2] 交换
  • 第 i 次从 arr[i-1]~arr[n-1]中选取最小值,与 arr[i-1]交换
  • 第 n-1 次从 arr[n-2]~arr[n-1]中选取最小值, 与 arr[n-2]交换,总共通过 n-1 次,得到一个按排序码从小到大排列的有序序列。
  • 选择排序思路分析图 :

三、代码实现

package main

import "fmt"

func main() {
    numbers := []int{6, 2, 7, 5, 8, 9}
    SelectSort(numbers)

    fmt.Println(numbers)
}

func SelectSort(values []int) {
    length := len(values)
    if length <= 1 {
        return
    }

    for i := 0; i < length; i++ {
        min := i // 初始的最小值位置从0开始,依次向右

        // 从i右侧的所有元素中找出当前最小值所在的下标
        for j := length - 1; j > i; j-- {
            if values[j] < values[min] {
                min = j
            }
        }
        //fmt.Printf("i:%d min:%d\n", i, min)

        // 把每次找出来的最小值与之前的最小值做交换
        values[i], values[min] = values[min], values[i]

        //fmt.Println(values)
    }
}

猜你喜欢

转载自blog.csdn.net/m0_38004619/article/details/106818903