Python的三种初级排序算法

目录

前言

一、插入排序

二、选择排序

三、冒泡排序

总结


前言

在初学python时毫无疑问的来说,排序算是有点难度的,但是借助python的列表排序的便利性,导致学习python的自己越来越懒,但是行于编程的世界里,我们不能只会站在前人的肩膀上,今天就来总结总结python的一些基础排序方式

一、插入排序

用我自己的话来说插入排序就是将一个给定的无序数组分为两部分,前面是挑选出来的已经排过序的,然后不断的将后面的元素插入到前面有序数组中,直到数组全部有序。来看着代码再来深刻了解一下吧。

a=[5,1,2,6,3,4,9,7,8]#先建立一个无序数组,在python中叫列表
for i in range(1,len(a)):#这是数组的后半部分,即无序数组,因为a[0]只有一个元素,默认是有序的,所以直接归到前面的有序数组中
    for j in range(i):#遍历已经排过序的数组
        if a[j]>a[i]:#找到插入位置,因为我们的最终目的是要递增的排列结果,所以插入的位置应该为第一个大于它的元素之前
            t=a[i]
            a.pop(i)#将其从无序数组中删除
            a.insert(j,t)#插入有序数组
            break#插入之后跳出本次数据循环,进入下一个数据的插入
#如果到最后都没有进入if分支条件,则证明本身大于所有有序数组的元素,那么它可以留在当前位置,不必进行插入排序
print(a)

等我ipad pencil到了,高低给大家整个图视,要不太抽象了,对吧。

但是有一说一,虽然插入排序的时间复杂度是o(n**2),但人家确实是一个稳定的算法,所以大家一定要用心细细的去体会。

二、选择排序

其实,选择排序和下面要提到的冒泡排序是最基础的排序,无论是在C语言还是python中其实应该都是我们接触最早的排序算法了。

选择排序的话,其实一开始的思想还是分为两部分,有序和无序,只不过它和插入排序不同的是它每次都遍历无序数组,找到最小的元素,然后将它放到有序数组的末尾,老规矩,来贴个代码看看。

先来个基础版

a=[5,4,6,3,2,1,8,9,7]
r=[]#用于存储有序列表的空列表
while len(a)!=0:#当无序列表中还有元素的时候,继续执行寻找最小元素的操作
    min1=0 #默认最小值的下标一开始是0,即第一个数
    for i in range(1,len(a)):
        if a[i]

我们可以清晰的看出选择的过程,但是这样实现选择排序需要两个同样空间的列表,如果数据量过大会浪费资源,所以我们需要对算法进行优化,让选择排序能在同一个数组中完成。

在来个选择排序原地版

a=[5,4,8,9,6,7,3,2]
for i in range(len(a)-1)#更新有序数组的末尾位置
    min1=i
    for j in range(i,len(a)):
        if a[j]

这个版本的是将有序数组放前面,然后遍历无序数组,第一个找到的最小值,和第一个位置的换位,然后第二个找到的再和第二个换位,不断的更新下标即可,在其他的编程语言中,不能和python一样使用pop(),insert()这样的操作,插入一个元素时,需要把插入位置向后移动一个,这种就更适合原地版。另外,选择排序的时间复杂度为o(n**2),并且,它是个不稳定的算法....

三、冒泡排序

最后一种基础排序算法就是冒泡排序,我一开始真的感觉这个名字很可爱,当然内容也很可爱啦,冒泡排序的原理是通过不断的相邻的元素进行比较,最大值会慢慢浮到末尾,因此得名的。

先贴一个我之前写的题的代码

a=[5,6,3,2,9,8,7,4,1]
for i in range(0,len(a)):
    for j in range(0,len(a)-1):
        if a[j]>a[j+1]:
            t=a[j]
            a[j]=a[j+1]
            a[j+1]=t
print(a)

这是之前没接触算法之前老师讲的,好像大概上也没毛病,但就是浪费空间时间....

现在算法的目的不就是节省空间时间吗?来看一下这个代码

a=[5,3,4,1,6,2,9,7,8]
for i in range(len(a),0,-1)# 确定本次遍历比较结束位置
    flag=0#定义一个标记变量,记录本次遍历是否有交换发生
    for j in range(i-1):
        if a[j]>a[j+1]:
            a[j],a[j+1]=a[j+1],a[j]
            flag=1
    if flag==0:
        break#如果没有发生交换,即证明都排序完毕了,跳出循环即可
print(a)

不可缺少的提一句,冒泡排序的时间复杂度是o(n**2),同时它是一个稳定的排序算法。

总结

今天也算是第一天开始静下心来学习python的算法,首先接触的就是基础排序算法,那今天就先学这些吧,明天我们再一起来学习高级排序算法,一定要注意练习哦,一定要用心去体会算法的精妙之处!

你可能感兴趣的:(排序算法,python,算法)