面试官:聊聊选择排序和插入排序吧

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)


以上是关于面试官:聊聊选择排序和插入排序吧的主要内容,如果未能解决你的问题,请参考以下文章

图解插入排序

面试官问我插入排序和冒泡排序哪个更牛逼?

面试官:冒泡插入选择这三种常见的排序算法你了解?为什么插入排序更受欢迎?

动画:面试官问我插入排序和冒泡排序哪个更牛逼?

面试 10:Java 玩转选择排序和插入排序

面试官:手写一个插入排序,并对其改进