用python实现快速排序,python中排序的用法

  用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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: