前言: 最近换工作,面试稍微大一点的厂都会被问到算法和数据结构这块知识,得空自己总结一下吧,总结不到位希望大佬指正哈。
情景记忆: 选择排序其实蛮好记的,看排序的名称就很容易联想,“选择”是这个排序的核心思想,那选择的时候是怎么选择的呢,其实要记住这个排序你就联想择优或者淘汰机制就很容易记住:择优是从一堆参差不齐的同种物品中选择最好的,比如有一对苹果,有大有小,我们择大而食;淘汰就是从一堆参差不齐的物品中淘汰最烂的,比如还是有一堆苹果,这次是腐烂程度不同的苹果或者快要腐烂,我们要从中选择腐烂程度最大的苹果丢弃。
逻辑实现: 以上的记忆方法是不是很贴近生活,这样就很容易记住了。逻辑其实也十分简单,一次选择一个最好的或最坏的出来,那么有N个数进行排序,那我们就可以看成是N趟排序,而一趟排序要对数值对比N次。
代码实现:
正向排序:
def select_sort(my_list): llen = len(my_list) for i in range(llen): print("第%s趟:" % (i + 1), my_list) for j in range(i, llen): if my_list[j] < my_list[i]: my_list[j], my_list[i] = my_list[i], my_list[j] if __name__ == '__main__': my_list = [7, 2, 0, 1, 5, 6, 8, 3, 9, 4] select_sort(my_list) 运行结果: 第1趟: [7, 2, 0, 1, 5, 6, 8, 3, 9, 4] 第2趟: [0, 7, 2, 1, 5, 6, 8, 3, 9, 4] 第3趟: [0, 1, 7, 2, 5, 6, 8, 3, 9, 4] 第4趟: [0, 1, 2, 7, 5, 6, 8, 3, 9, 4] 第5趟: [0, 1, 2, 3, 7, 6, 8, 5, 9, 4] 第6趟: [0, 1, 2, 3, 4, 7, 8, 6, 9, 5] 第7趟: [0, 1, 2, 3, 4, 5, 8, 7, 9, 6] 第8趟: [0, 1, 2, 3, 4, 5, 6, 8, 9, 7] 第9趟: [0, 1, 2, 3, 4, 5, 6, 7, 9, 8] 第10趟: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
逆向排序:
def select_sort(my_list): llen = len(my_list) for i in range(llen): print("第%s趟:" % (i + 1), my_list) for j in range(i, llen): if my_list[j] > my_list[i]: my_list[j], my_list[i] = my_list[i], my_list[j] if __name__ == '__main__': my_list = [7, 2, 0, 1, 5, 6, 8, 3, 9, 4] select_sort(my_list) 运行结果: 第1趟: [7, 2, 0, 1, 5, 6, 8, 3, 9, 4] 第2趟: [9, 2, 0, 1, 5, 6, 7, 3, 8, 4] 第3趟: [9, 8, 0, 1, 2, 5, 6, 3, 7, 4] 第4趟: [9, 8, 7, 0, 1, 2, 5, 3, 6, 4] 第5趟: [9, 8, 7, 6, 0, 1, 2, 3, 5, 4] 第6趟: [9, 8, 7, 6, 5, 0, 1, 2, 3, 4] 第7趟: [9, 8, 7, 6, 5, 4, 0, 1, 2, 3] 第8趟: [9, 8, 7, 6, 5, 4, 3, 0, 1, 2] 第9趟: [9, 8, 7, 6, 5, 4, 3, 2, 0, 1] 第10趟: [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
选择排序总结:
没有最好的算法只有最合适的算法,一个算法的好坏,与运用的场景通常是于算法的时间复杂度、空间复杂度和稳定性相关的。
时间复杂度:时间复杂度的衡量标准是每次比较和交换位置所花的时间综合,也就是完成排序所花的时间总和称为时间复杂度;计算标准是一次循环(不论循环几次)我们记为n,如果能够差分为二叉树结构的我们记为log n,那么选择排序的时间复杂度我们可用看出是O(n^2)
空间复杂度:空间复杂度的衡量标准是在完成排序的整个过程中是否有申请新的存储空间来完成排序,如果有,且申请的空间越多那么我们则认为该算法的空间复杂度约复杂,那么冒泡排序在过程中没有申请存储空间,所有我们认为选择排序的空间复杂度小(除了自己本身)
稳定性:即在原序列中,list[i]=list[j],且list[i]在list[j]之前,而在排序后的序列中,list[i]仍在list[j]之前,则称这种排序算法是稳定的,否则称为不稳定的,那么我们认为冒泡排序是稳定的,稳定性比较:堆排序、快速排序、希尔排序、选择排序是不稳定的排序算法,而冒泡排序、插入排序、归并排序是稳定的排序算法。