前言:
如今姐妹们对“常用排序算法的实现”可能比较关心,兄弟们都需要剖析一些“常用排序算法的实现”的相关资讯。那么小编也在网摘上网罗了一些有关“常用排序算法的实现””的相关资讯,希望兄弟们能喜欢,姐妹们快快来了解一下吧!1. 算法步骤
首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。
再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
重复第二步,直到所有元素均排序完毕。
2. 动图演示3.时间复杂度与空间复杂度无论是有序还是逆序列表,选择排序需要的比较次数均为(n-1)*n/2,所以:
Cmin~ = C~max~ = n*(n-1)/2=O(n^2)
如果是有序列表,那么交换顺序为0,如果是逆序列表,那么交换顺序为3*n,所以:
Mmin~ = 0, M~max~=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 list1if __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 list1if __name__ == '__main__': list2 = [3, 5, 6, 1, 2] print(select_fun(list2)) """ # 输出结果 交换次数 4 [1, 2, 3, 5, 6] """每交换一次都会增加额外的内存地址,可以看出真正的选择算法可以明显减少内存空间占用。感兴趣的小伙伴可以看看上面的交换次数是多少次
版权声明:
本站文章均来自互联网搜集,如有侵犯您的权益,请联系我们删除,谢谢。
标签: #常用排序算法的实现