助你吃透那些年被捧上天的神秘算法(Python版②)

废话环节

学习小伙不请自来(biubiubiu…),简单的说这是博主的第二篇关于Python数据结构的博客,所以文章中可能有些地方思路不是很清晰,希望大家发现并指出,近期博主也在一直努力吃透Python算法精髓,奈何背道而驰,现在仍然让算法困扰不前,写这篇博客一是想帮助Python爱好者,了解一下Python底层的算法,二是希望有大牛能够指导点播一下本小白。爱Life,爱Python,这篇博客可能劳烦大家转动一下自己的小脑筋,如果没有吃透上一篇博客请戳此处:冒泡排序因为本篇博客是以冒泡排序为基础写作的,如果有吃瓜群众看不明白请回戳:冒泡排序,突突突…(开始)

①选择排序(简介)

选择排序(Selection sort),总体上是改进了冒泡排序的一种基础算法,每次遍历列表中的元素然后只做一次交换。为了做到这一点,一个选择排序在它遍历时寻找最大的值,并在完成遍历结束后,将其放置在对应的位置。与冒泡排序一样,在第一次遍历后,最大的项在正确的地方。 第二次遍历后,次大的放在其后。遍历 n-1 次排序 n 个项。

假设你的计算机存储了很多乐曲。对于每个乐队,你都记录了其作品被播放的次数。
在这里插入图片描述
你要将这个列表按播放次数从多到少的顺序排列,从而将你喜欢的乐队排序。该如何做呢?
首当其冲,遍历这个列表,找出作品播放次数最多的乐队,然后从大到小依次排列。达到如下的效果:
在这里插入图片描述
附上一份非常经典的选择排序流程图
HaoXuan
按照如上所示,用代码去初步实现排序

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @Time    : 2020/3/17 14:13
# @Author  : HaoXuan
# @File    : 选择排序.py
# @Software: PyCharm
def select_sort(alist):
    n = len(alist)
    for j in range(n-1):
        for i in range(j+1,n):
            if alist[j] > alist[i]:
                alist[j],alist[i] = alist[i],alist[j]

list0 = [26,54,93,17,72,31,44,55,20]
select_sort(list0)
print(list0)

纠错:上面所写的代码虽然也可以让元素按照正确顺序排列,但是里面的设计思路与选择排序有所不同。以上代码根本上是完全继承了冒泡排序的思路,相邻元素互换位置,谁小就往前放,但没有依次选择出最小的元素往前放;
选择排序要求:遍历一轮后,把最小的放最前面,然后对剩余元素再次遍历,选出最小的放在第二个位置
修改代码如下:

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @Time    : 2020/3/17 14:13
# @Author  : HaoXuan
# @File    : 选择排序.py
# @Software: PyCharm
def select_sort(alist):
    n = len(alist)
    # 需要进行n-1次选择操作
    for i in range(n - 1):
        # 记录最小值索引的位置
        min_index = i
        # 从i+1位置到末尾选择出最小数据
        for j in range(i + 1, n):
            if alist[min_index] > alist[j]:
                min_index = j
        alist[i], alist[min_index] = alist[min_index], alist[i]


list0 = [26, 54, 93, 17, 72, 31, 44, 55, 20]
select_sort(list0)
print(list0)

你可能会看到选择排序与冒泡排序有相同数量的比较,所以选择排序时间复杂度
最优时间复杂度:O(n2)
最坏时间复杂度:O(n2)
稳定性:不稳定
在某种层面来说如果选择排序运用不够灵巧,那不如回戳:冒泡排序来帮助你解决Question,此处需要观众们细想…

②快速选择排序

选择排序是一种非常非常灵巧的算法,但其速度不是很快。快速排序是一种更快的排序算法,其运行
时间复杂度为O(n log n)

快速选择排序动态分析:
在这里插入图片描述
如下所示将随机取一数组并将元素按从小到大的顺序排列。先编写一个用于找出数组中最小元素的函数。

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @Time    : 2020/3/17 14:13
# @Author  : HaoXuan
# @File    : 快速选择排序.py
# @Software: PyCharm
def findSmallest(arr):
    smallest = arr[0]  # 存储最小的值
    smallest_index = 0  # 存储最小元素的索引

    for i in range(1, len(arr)):  # 对数组进行排序
        if arr[i] < smallest:
            smallest = arr[i]
            smallest_index = i
    return smallest_index


# 快速选择排序核心代码
def selectionSort(arr):
    newArr = []
    for i in range(len(arr)):
        smallest = findSmallest(arr)  # 找出数组中最小的元素,并将其加入到新数组中
        newArr.append(arr.pop(smallest))
    return newArr


print(selectionSort([5, 3, 6, 2, 10]))  #随机取值

运行如下图所示
在这里插入图片描述
博主也是个现学现卖的小白,如果文章中出现了什么技术问题,希望大牛们能够及时指出,我也在不断努力学习,希望能够把博文写的更好,帮助大家减轻阅读时的烦恼,所以,希望大家初期多担待一下,努力ing
HaoXuan
@Author:HaoXuan

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章