首页 > 代码库 > 【算法日记】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.选择排序
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。