首页 > 代码库 > 【算法日记】3.选择排序

【算法日记】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(n2)。

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

 

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