选择排序

18 阅读1分钟

选择排序

选择排序原理非常简单:开启一个循环,每轮从为排序区间选择最小的元素,将其放到已排序区间的末尾

有一个长度为n的数组,选择排序流程如下

  • 初始状态下,所有元素未排序,即未排序(索引)区间为[0,n-1]
  • 选取区间[0,n-1]中的最小元素,将其与索引 处的元素交换。完成后,数组前 1 个元素已排序
  • 选取区间[1,n-1]中的最小元素,将其与索引 处的元素交换。完成后,数组前 2 个元素已排序。
  • 以此类推。经过n-1轮选择与交换后,数组前n-1个元素已排序。
  • 仅剩的一个元素必定是最大元素,无须排序,因此数组排序完成。
/*选择排序*/
func selectionSort(nums []int) {
    n := len(nums)
    //外循环:未排序区间为[i,n-1]
    for i := 0; i < n-1; i++ {
        //内循环:找到未排序区间内的最小元素
        k := i //用来记录未排序区间最小元素
        for j := i + 1; j < n; j++ {
            if nums[j] < nums[k] {
                //记录最小元素索引
                k = j
            }
        }
        //将最小元素与为排序首个元素交换
        nums[i], nums[k] = nums[k], nums[i]
    }
}

外层循环用来控制未排序区间,内层循环用来找到未排序中最小的元素