用python实现快速排序,python中排序的用法
这篇博文是用来介绍直接插入排序的。
直接插入排序的基本思想是:将一条待排序的记录一次插入到已排序的数据区,直到所有记录都被插入。
直接插入排序算法的思想:在直接插入排序中,数据元素分为两部分:有序区和无序区。这里,我们把列表的左边部分作为有序区域,右边部分作为无序区域。有序区域和无序区域的大小随着排序而变化。
如果列表一开始是无序的,那么有序区域的长度是1,无序区域的长度是-1。排序后列表变成有序的,有序区域的长度就是列表的长度,无序区域的长度是0。
具体步骤如下:
在排序过程中,每次从无序区取出第一个元素,插入到有序区的适当位置(即元素放在这个位置,有序区仍然是有序的),使之成为一个新的有序区。重复n-1次即可完成排序过程。
假设您需要从小到大对列表进行排序。
要把你想从无序区取出的第一个元素temp插入到有序区的适当位置,需要有一个循环遍历的过程,就是依次从该元素的位置向前比较。会有两种情况:
1.如果前一个元素waitsortlist[j-1]大于temp,那么temp需要继续向前比较,大于temp的元素需要向后移动一位。
2.如果前一个元素waitsortlist[j-1]小于等于temp,那么就不需要比较temp,因为temp大于有序区域中最大的元素,有序区域扩展一位,包括temp。
另外还需要考虑J的边界问题,因为会用到j-1,所以J需要=1,防止越界。无序区域中元素temp的直接插入代码如下:
temp=waitsortlist[j]
当j=1时:
if temp waitsortlist[j-1]:
等待排序列表[j]=等待排序列表[j-1]
j=j-1
否则:
破裂
Waitsortlist[j]=temp外层是一个链表的遍历,加上上面的代码就是:
i=0
j=11
while j len(waitsortlist):
temp=waitsortlist[j]
当j=1时:
if temp waitsortlist[j-1]:
等待排序列表[j]=等待排序列表[j-1]
j=j-1
否则:
破裂
waitsortlist[j]=temp
i=i 1
J=i 1可以看出,链表的第一个元素一定是有序区域,有序区域的范围在遍历的过程中不断扩大。对于列表中的某个元素,它被插入到有序区域中的适当位置。在外循环遍历之后,有序区域也被扩展到列表的长度,即排序完成。
算法的时间复杂度为O (n 2),因为有两层循环,时间开销比较大,空间复杂度为O(1)。它只使用常序空间存储变量,用于直接插入和排序。
所有的代码都是(其实看了上一个,相信你已经可以写成:D了
直接插入排序
def DirectInsertionSort(wait sort list):
i=0
j=11
while j len(waitsortlist):
temp=waitsortlist[j]
当j=1时:
if temp waitsortlist[j-1]:
等待排序列表[j]=等待排序列表[j-1]
j=j-1
否则:
破裂
waitsortlist[j]=temp
i=i 1
j=11
返回等待排序列表
if __name__==__main__ :
waitsortlist=[9,8,7,6,5,4,3,2,1,0]
print(direct insertion(wait sort list))按如下方式运行:
直接插入排序(带sentinel):sentinel的概念:所有为了简化边界条件而引入的附加节点(元素)都可以称为sentinel。
在上面的代码中,我们可以看到有这样一段:
而j=1:每次内循环比较之前,都要判断J是否出界。有没有不需要判断的方法?当然,这就是哨兵的作用。
将上面的代码更改为:
def DirectInsertionSortEye(wait sortlist):
i=1
j=11
while j len(waitsortlist):
temp=waitsortlist[j]
waitsortlist[0]=temp
while temp waitsortlist[j-1]:
等待排序列表[j]=等待排序列表[j-1]
j=j-1
waitsortlist[j]=temp
i=i 1
j=11
返回等待排序列表
if __name__==__main__ :
waitsortlist=[0,9,8,7,6,5,4,3,2,1,0]
print(directinsertionsorteye(wait sortlist))的输出结果是:
我们将waitsortlist[0]设置为哨兵。链表传入时,有效元素不能放在这个位置,是否越界的比较时间可以通过链表中一个元素的空格来判断。可见一个周期判断少,n个周期判断少。当数据量较大时,明显优于没有watchpost的直接插入排序。
用watchpost直接插入排序的思路也很简单,在原有基础上稍加修改即可,这里不再赘述。
春鸟Cl0udG0d,
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。