排序算法之——选择排序

本文将详细说明关键变量的做用,结合代码进行梳理python

使用语言:python数组


选择排序的过程markdown

  1. 数组分为无序与有序两个部分
  2. 每次从无序序列中选择最小(大)的数,与无序序列第一个数进行交换
  3. 重复第二步,直到整个序列都为有序序列

如下疑问:ui

  1. 谁来界定有序无序的分割位置?spa

    答:外层循环的 i :无序序列的第一个数字的下标code

  2. 谁去找无序序列的最小(大)值?orm

    答:内层循环的 j :遍历无序序列,对应最小(大)值的下标,所以 j 的遍历区间也就是 [i+1,len(arr)) (左闭右开)排序

  3. 谁来保存每次找到的最小值的索引?教程

    答:minIndex :若 j 找到了更小(大)的值,会 minIndex=j ,记录最新的最小(大)值的下标索引


选择排序的代码 (代码是采用的菜鸟教程的示例代码,是升序排序)

def selectionSort(arr):
    for i in range(len(arr) - 1): 
        # 记录最小数的索引
        minIndex = i #假设当前最小值的索引就是i,这只是假设的
        for j in range(i + 1, len(arr)): #j去找无序序列的最值
            if arr[j] < arr[minIndex]: #找到了更小的!
                minIndex = j #赶忙将更小值的索引更新给minIndex
        ''' 好啦,如今j已经找完无序序列啦,由于一开始i是假设的最小值的索引,并将这个假设的最小值的索引i赋给了minIndex 因此咱们如今来看看i是否和minIndex还相同(即下面的if过程) 若是相同,就意味着minIndex根本没有改变,即j没有找到更小值 若是不相同,就意味着j找到了更小值,并将更小值的索引j赋给了minIndex,minIndex更新了 才致使了minIndex和初始值i不同了,由于找到了更小的值 接下来交换arr[i]和arr[minIndex] (与无序序列的第一个数字交换) if i != minIndex: arr[i], arr[minIndex] = arr[minIndex], arr[i] return arr 复制代码

排序举例:

待排序列: 43,65,4,23,6,98,2,65,7,79 
第一趟: 2,65,4,23,6,98,43,65,7,79 
第二趟: 2,4,65,23,6,98,43,65,7,79 
第三趟: 2,4,6,23,65,98,43,65,7,79 
第四趟: 2,4,6,7,43,65,98,65,23,79 
第五趟: 2,4,6,7,23,65,98,65,43,79 
第六趟: 2,4,6,7,23,43,98,65,65,79 
第七趟: 2,4,6,7,23,43,65,98,65,79 
第八趟: 2,4,6,7,23,43,65,65,98,79 
第九趟: 2,4,6,7,23,43,65,65,79,98
结束
复制代码