电子商务网站开发背景与原因,网站建设 手机网站,网站模板带手机站,wordpress 菜单函数这篇博文用来介绍直接插入排序直接插入排序基本思想#xff1a;每次将一个待排序的记录插入到已经排好序的数据区中#xff0c;直到全部插入完为止直接插入排序算法思路#xff1a;在直接插入排序中#xff0c;数据元素分为了有序区和无序区两个部分#xff0c;在这里我们…这篇博文用来介绍直接插入排序直接插入排序基本思想每次将一个待排序的记录插入到已经排好序的数据区中直到全部插入完为止直接插入排序算法思路在直接插入排序中数据元素分为了有序区和无序区两个部分在这里我们将列表左边部分作为有序区列表右边部分作为无序区有序区和无序区的大小是随着排序的进行而变化的。如最开始列表是无序的所以有序区长度为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的直接插入代码如下tempwaitsortlist[j]while j1:if tempwaitsortlist[j]waitsortlist[j-1]jj-1else:breakwaitsortlist[j]temp外层是一个列表的遍历加上上面的代码为i0ji1while jtempwaitsortlist[j]while j1:if tempwaitsortlist[j]waitsortlist[j-1]jj-1else:breakwaitsortlist[j]tempii1ji1可以看出列表的第一个元素必为有序区遍历的过程中不断扩大有序区的范围对于列表某一个元素来说就是将其插入在有序区中适当的位置外层循环遍历结束后有序区也扩充为列表长度即排序结束。该算法的时间复杂度为O(n^2)因为有两层循环时间开销比较大空间复杂度为O(1)只是用了常数阶的空间来存储变量用以直接插入排序全部代码为(实际上看了前面的相信你已经能写出来了:D直接插入排序def DirectInsertionSort(waitsortlist):i0ji1while jtempwaitsortlist[j]while j1:if tempwaitsortlist[j]waitsortlist[j-1]jj-1else:breakwaitsortlist[j]tempii1ji1return waitsortlistif __name____main__:waitsortlist[9,8,7,6,5,4,3,2,1,0]print(DirectInsertionSort(waitsortlist))运行结果为直接插入排序 (带监视哨)哨兵的概念一切为简化边界条件而引入的附加结点(元素)均可称为哨兵。在上面的代码我们可以看到有这一段while j1:内循环每一次比较前都需要判断 j 是否越界有没有不需要判断的办法呢当然有这就是哨兵的作用将上面的代码改为def DirectInsertionSortEye(waitsortlist):i1ji1while jtempwaitsortlist[j]waitsortlist[0]tempwhile tempwaitsortlist[j]waitsortlist[j-1]jj-1waitsortlist[j]tempii1ji1return waitsortlistif __name____main__:waitsortlist[0,9,8,7,6,5,4,3,2,1,0]print(DirectInsertionSortEye(waitsortlist))输出的结果为我们将waitsortlist[0]设置为哨兵传入列表的时候该位置也不能够放置有效元素用列表一个元素的空间判断越界与否的比较时间。可以看出一次循环少判断一次n次循环少判断n次当数据量较大时很明显是优于不带监视哨的直接插入排序。带监视哨的直接插入排序思想也很简单在原有基础上稍加修改即可这里不再赘述。