选择排序

  • 时间复杂度为,额外空间复杂度

一句话总结

从前到后依次保证当前最小

Note

选择排序的时间复杂度计算结果为等比数列求和,请自行尝试求解

  • 思路 从第1位到最后一位逐位保证当前最小,即 从第1位开始,找到从该位到最后一位中最小的数,并交换到第1位 从第2位开始,找到从该位到最后一位中最小的数,并交换的第2位 … 直到最后一位

  • 演示

  • 伪代码

    ''' 选择排序,Input: arr (arr.shape = [1, N]) '''
    for i in range(0, N):
    	minNum = min(arr[i:N-1])# 找到i位置到最后的最小值 -> 每个看一眼并比较,约 O(2N)
    	swap(arr[i], minNum)    # 移动到最前 -> 交换两个数 O(1)
  • 实际代码

	def selectSort(nums: List[int]) -> List[int]:
    N = len(nums)
    for i in range(0, N):
        minIdx = i
        for j in range(i, N): # 找i-N中的最小值
            if nums[j] < nums[minIdx]:
                # 这里记录最小值的下标,最后再换,能省点时间
                minIdx = j 
        nums = swap(nums, i ,minIdx)
    return nums
 
	def swap(nums: List[int], i: int, j: int) -> List[int]:
	    temp = nums[i]
	    nums[i] = nums[j]
	    nums[j] = temp
	    return nums

笔记

注意代码中是两个循环嵌套,非常慢的 故意没有自带的排序算法,就是为了体现时间复杂度的计算