美文网首页
Day2 选择排序

Day2 选择排序

作者: 快乐的老周 | 来源:发表于2020-05-24 22:59 被阅读0次

交作业:
def selection_sort(mylist):
for i in range(len(mylist)):
current_max = select_max(mylist[:len(mylist)-i])
mylist[-1-i],mylist[mylist.index(current_max)]= mylist[mylist.index(current_max)] ,mylist[-1-i]
return mylist

def select_max(list1):
mymax = list1[0]
for i in list1[1:]:
if mymax < i:mymax =i
return mymax

def test_selection_sort():
assert selection_sort([0, 5, 2, 3, 2]) == [0, 2, 2, 3, 5]
assert selection_sort([-2, -45, -5]) == [-45, -5, -2]
assert selection_sort([-23, 0, 6, -4, 34]) == [-23, -4, 0, 6, 34]


title: day2:选择排序
date: 2020-05-24 19:00:24
tags: python
categories: 算法原理


1. 算法步骤

首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。

再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。

重复第二步,直到所有元素均排序完毕。

2. 动图演示

image

3.时间复杂度与空间复杂度

  • 无论是有序还是逆序列表,选择排序需要的比较次数均为(n-1)*n/2,所以:

Cmin = Cmax = n*(n-1)/2=O(n2)

  • 如果是有序列表,那么交换顺序为0,如果是逆序列表,那么交换顺序为3*n,所以:

Mmin = 0, Mmax=3*n=O(n)

  • 从这里来看,选择排序是以牺牲时间换空间的一种排序方式,即增加了数据的读取,而减少了内存的占用

4.选择排序算法的实现步骤

错误示范

def select_fun(list1):
    n = len(list1)
    for i in range(n-1):  # 开启循环,只需要循环n-1次即可,
        # 假设第i个值为最小值,min_value = list1[i]
        for j in range(i+1, n):  # j 输入i后面的数字
            if list1[j] < list1[i]:  # 如果发现后面存在比最小值档还小的数
                list1[i], list1[j] = list1[j], list1[i]  # 交换顺序
    return list1


if __name__ == '__main__':
    list2 = [3, 5, 6, 1, 2]
    print(select_fun(list2))
    """
    # 输出结果
    [1, 2, 3, 5, 6]
    """
  • 此代码中虽然也没有太大问题,但是循环中只要找到小的就交换一次,增加了内存占用。
  • 实际应该为在单次循环时不进行位置交换,而是单次循环后再进行位置交换

正确示范

def select_fun(list1):
    n = len(list1)
    count = 0  # 统计更改次数
    for i in range(n-1):  # 开启循环,只需要循环n-1次即可,
        min_index = i
        for j in range(i+1, n):  # j 输入i后面的数字
            if list1[j] < list1[min_index]:  # 如果发现后面存在比最小值档还小的数
                min_index = j  # 这里暂时不更改位置,等循环结束后再更改
        if min_index != i:  # 判断当前的最小值是不是i所在位置
            list1[i], list1[min_index] = list1[min_index], list1[i]
            count += 1
    print('交换次数', count)
    return list1


if __name__ == '__main__':
    list2 = [3, 5, 6, 1, 2]
    print(select_fun(list2))
    """
    # 输出结果
    交换次数 4
    [1, 2, 3, 5, 6]
    """
  • 每交换一次都会增加额外的内存地址,可以看出真正的选择算法可以明显减少内存空间占用。
  • 感兴趣的小伙伴可以看看上面的交换次数是多少次

相关文章

  • Day2 选择排序

    交作业:def selection_sort(mylist):for i in range(len(mylist)...

  • 算法-选择排序

    算 法:选择排序算法时间复杂度: 选择排序算法概述 选择排序伪代码 选择排序实现 选择排序算法概述 排序算法有许...

  • 常见排序算法

    这里介绍四种排序算法,选择排序、快速排序、归并排序、计数排序 选择排序(使用递归) 选择排序(使用循环) 快速排序...

  • 常用的两种排序-冒泡、选择

    Swift版 冒泡排序 选择排序 OC版 冒泡排序 选择排序

  • 数据结构之排序

    选择排序1.直接选择排序 原理直接选择排序过程直接选择排序过程 实现: DataWrap.java来模拟待排序的数...

  • 记录几个常见的排序算法

    常见的排序有:快速排序、冒泡排序、希尔排序、选择排序、插入排序、归并排序 冒泡排序: 插入排序: 选择排序: 希尔...

  • PHP常用算法

    基于选择的排序算法 常见的基于选择的排序算法有:冒泡排序、插入排序、选择排序、归并排序和快速排序,我们在选在排序算...

  • 排序 -- 选择/插入

    聊聊排序吧 冒泡排序 选择排序 插入排序 快速排序 归并排序 计数排序 桶排序 堆排序 本篇 选择排序与插入排序 ...

  • java快速学习排序---选择排序

    1.java实现选择排序 (1)、图解选择排序 (2)、选择排序的思想 选择排序首先在未排序序列中找到最小(大)元...

  • IOS 常用算法

    一:排序算法 排序方式有插入排序,选择排序和交换排序三种。插入排序有直接插入排序和希尔排序。选择排序有简单选择排序...

网友评论

      本文标题:Day2 选择排序

      本文链接:https://www.haomeiwen.com/subject/zfysahtx.html