面试官:聊聊选择排序和插入排序吧
Posted 爬虫工程师之家
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试官:聊聊选择排序和插入排序吧相关的知识,希望对你有一定的参考价值。
在上一篇文章中,我们简单的分析了一下冒泡排序和快速排序, ,一般来说呢,面试的时候考察排序算法最多的就是冒泡排序和快速排序了,仅次于冒泡排序和快速排序的就是选择排序和插入排序了,本文就这两个排序算法和大家简单的聊一聊。
选择排序
算法思想:选择排序,从头至尾扫描序列,找出最小的一个元素,和第一个元素交换,接着从剩下的元素中继续这种选择和交换方式,最终得到一个有序序列。
其排序过程为(第一轮排序)
原始无序序列:49、38、65、97、76、13、27、49
1、从无序序列中选出基准值,一般选取索引为0,也就是无序序列中第一位元素,49。
2、从无序序列中索引为1的元素开始,逐个和基准值进行比较,如果有比基准值小的元素,将该元素设置为基准值,如38,继续查找无序队列中剩余的元素,直到找到最小元素,如本例中,最终找到的最小元素为13,取出最小的元素13,将13同无序序列第一个元素交换,此时产生仅含一个元素的有序序列,无序序列减一。
结果:{13、} {38、65、97、76、49、27、49}
3、重复如上步骤,最终得到一个有序序列。
其代码实现为:
def choice_sort(alist):
'''
选择排序
:param alist: 无序序列
:return: 有序序列
'''
n = len(alist)
# 不断选取基准值
for j in range(0,n):
min = j
# 从无序序列中找到最小元素
for i in range(j+1,n):
if alist[i] < alist[min]:
min = i
alist[j],alist[min] = alist[min],alist[j]
print(alist)
if __name__ == '__main__':
alist = [49,38,65,97,76,13,27,49]
choice_sort(alist)
#[13, 27, 38, 49, 49, 65, 76, 97]
接下来,我们来看插入排序
算法思路:每次将一个待排序的元素作为关键字,按照其关键字值的大小插入到已经排好的部分的适当位置上,直到插入完成。
算法过程
原始序列:49、38、65、97、76、13、27、49
1、开始以第一个元素49为关键字,看成一个序列,其余数看成另一个序列,此时一个关键字数49序列是有序的。
结果:{49} {38、65、97、76、13、27、49}
2、插入38。38<49,所以49向后移动一个位置,38插入到原49位置
结果:{38、49} {65、97、76、13、27、49}
3、重复如上过程,最终得到一个 有序序列。
其代码实现为
def insert_sort(alist):
'''
插入排序
:param alist: 无序序列
:return: 有序序列
'''
n = len(alist)
# 一般选取索引为0的值为基准值,从索引为1的值开始比较,找到该值合适的位置
for i in range(1,n):
while i > 0:
# 无序序列中的值和有序序列中的值进行比较,找到合适的位置
if alist[i] < alist[i-1]:
alist[i-1],alist[i] = alist[i],alist[i-1]
i = i - 1
# 注意当无序序列中的值大于有序序列中的值时的死循环
else:
break
print(alist)
if __name__ == '__main__':
alist = [49,38,65,97,76,13,27,49]
insert_sort(alist)
以上是关于面试官:聊聊选择排序和插入排序吧的主要内容,如果未能解决你的问题,请参考以下文章