• 【算法日记】3.选择排序


    1.数组和链表

    • 数组是将元素在内存中连续存放,由于每个元素占用内存相同,可以通过下标迅速访问数组中任何元素。但是如果要在数组中增加一个元素,需要移动大量元素,在内存中空出一个元素的空间,然后将要增加的元素放在其中。同样的道理,如果想删除一个元素,同样需要移动大量元素去填掉被移动的元素。如果应用需要快速访问数据,很少或不插入和删除元素,就应该用数组。
    • 链表恰好相反,链表中的元素在内存中不是顺序存储的,而是通过存在元素中的指针联系到一起。比如:上一个元素有个指针指到下一个元素,以此类推,直到最后一个元素。如果要访问链表中一个元素,需要从第一个元素开始,一直找到需要的元素位置。但是增加和删除一个元素对于链表数据结构就非常简单了,只要修改元素中的指针就可以了。如果应用需要经常插入和删除元素你就需要用链表数据结构了。

    2.数组与链表的运行时间

      数组 链表
    读取 O(1) O(n)
    插入 O(n) O(1)
    删除 O(n) O(1)

      数组适合读取操作,链表适合插入和删除

    3.选择排序算法

           选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法

    例如 :

    对数组[5,4,3,2,1]进行排序

    第一步 找出最小的 数字1 放入新数组[1],执行步数为 4    原数组变为[5,4,3,2]

    第二步 从[5,4,3,2]找出最小的 数字2 放入新数组[1,2],执行步数为 3  原数组变为[5,4,3]

    第三步 从[5,4,3]找出最小的 数字3 放入新数组[1,2,3],执行步数为 2 原数组变为[5,4]

    第四步 从[5,4]找出最小的 数字4 放入新数组[1,2,3,4],执行步数为 1

    第五步 将最后一个 5 插入 [1,2,3,4,5]。至此 排序结束,

    def selectSort(arr):
        sort=[]
        step=0
        for j in range(len(arr)):
            smallest=arr[0]
            index=0    # 从第一位开始
            for i in range(1,len(arr)):
                if arr[i]<smallest:
                    step+=1
                    smallest=arr[i]
                    index=i
            sort.append(arr.pop(index))
        
        print u"执行步数",step
        print sort
        return sort
        
    selectSort([5,4,3,2,1])
    selectSort([7,6,5,4,3,2,1])
    selectSort([8,7,6,5,4,3,2,1])

    上面的例子是选择排序最糟糕的情况下 执行情况,操作数为n+(n-1)+(n-2)+.......1

    因为每次必须检查数组中所有的元素,这个运行时间为O(n),这样的操作要执行n次 。所有需要的总运行时间为:O(n*n) 即O(n²)。

    选择排序不是一种快速的排序方式

  • 相关阅读:
    用户描述
    课堂练习
    一阶段11.21
    一阶段11.20
    一阶段 11.19
    自己动手写spring(五) bean的生命周期管理
    自己动手写spring(四) 整合xml与注解方式
    自己动手写spring(三) 支持注解方式
    自己动手写spring(二) 创建一个bean工厂
    自己动手写spring(一) 使用digester
  • 原文地址:https://www.cnblogs.com/zimuzimu/p/7087787.html
Copyright © 2020-2023  润新知