数据结构与算法(Python)(六)—— 排序算法(2)选择排序

选择排序

  • 选择排序(Selection sort)是一种简单直观的排序算法。将数列分为未排序序列和已排序序列两部分,在未排序序列中找到最小(大)元素,存放到数列的起始(末尾)位置作为已排序序列的第一个元素,然后,再从剩余未排序序列中继续寻找最小(大)元素,然后放到已排序序列的末尾(起始)位置。以此类推,直到所有元素均排序完毕。

  • 选择排序的主要优点与数据移动有关。如果某个元素位于正确的最终位置上,则它不会被移动。选择排序每次交换一对元素,它们当中至少有一个将被移到其最终位置上,因此对n个元素的表进行排序总共进行至多n-1次交换。在所有的完全依靠交换去移动元素的排序方法中,选择排序属于非常好的一种。

  • 选择排序算法的具体运作如下:

    1. 首先将数列的第一个元素认为是最小的元素,记 min = 0,将其与其他元素进行比较,若找到了更小的元素,则改变 min 的值,遍历序列后,将 min 值对应的元素与第一个元素进行交换。
    2. 将数列的第二个元素认为是最小的元素,记 min = 1,重复以上步骤。
    3. 重复以上步骤,直到没有任何一对数字需要比较,排序完成。
  • 算法实现(分步)

ali = [54, 26, 93, 22, 77, 31, 44, 55, 20]
n = len(ali)  # 9

1.将数列的第一个元素 ali[0] 认为是最小的元素,记 min = 0,将其与其他元素进行比较,若找到了更小的元素,则改变 min 的值,遍历序列后,将 min 值对应的元素与第一个元素进行交换。

min = 0
for i in range(1, n):
    if ali[i] < ali[min]:
        min = i
ali[min], ali[0] = ali[0], ali[min]

2.将数列的第二个元素 ali[1] 认为是最小的元素,记 min = 1,将其与其他元素进行比较,若找到了更小的元素,则改变 min 的值,遍历序列后,将 min 值对应的元素与第二个元素进行交换。
3.重复以上步骤,直到将数列的倒数第二个元素 ali[n-2] 认为是最小的元素,记 min = n-2,将其与最后一个元素进行比较,若最后一个值更小,则改变 min 的值,将 min 值对应的元素与倒数第二个元素进行交换,完成排序。

  • 算法实现(整体)
def selection_sort(ali):
    n = len(ali)
    for j in range(n-1):
        min = j
        for i in range(j+1, n):
            if ali[i] < ali[min]:
                min = i
        ali[min], ali[j] = ali[j], ali[min]


if __name__ == '__main__':
    ali = [54, 26, 93, 22, 77, 31, 44, 55, 20]
    print(ali)
    selection_sort(ali)
    print(ali)
  • 时间复杂度
    最优时间复杂度: O ( n 2 ) O(n^2)
    最坏时间复杂度: O ( n 2 ) O(n^2)
    稳定性:不稳定(考虑升序每次选择最大的情况)
发布了51 篇原创文章 · 获赞 4 · 访问量 3512

猜你喜欢

转载自blog.csdn.net/yhhuang17/article/details/103223615
今日推荐