Python使用二分插入排序竟然比直接插入排序快99倍!



Python使用二分插入排序竟然比直接插入排序快99倍!

之前发布同一个算法,C++竟然比C快8倍!  , 有同学提出是因为C++中使用了二分插入排序,于是用python比较了下两种排序差距有多大。

测试结果如下:

Python insertion sort took time: 1:39:42.448904
Python insertion sort with binary search took time: 0:01:13.263267

代码如下:

import datetime
import bisect

def insertion_sort(l):
    for i in xrange(1, len(l)):
        j = i-1
        key = l[i]
        while (l[j] > key) and (j >= 0):
           l[j+1] = l[j]
           j -= 1
        l[j+1] = key

def insertion_sort_bin(seq):
    for i in range(1, len(seq)):
        bisect.insort(seq, seq.pop(i), 0, i)

a=[]
for x in range(200000):
	a.append(x)

a.reverse()

start = datetime.datetime.now()
insertion_sort(a)
end = datetime.datetime.now()
print "Python insertion sort took time: %s" % (end-start)

a.reverse()

start2 = datetime.datetime.now()
insertion_sort_bin(a)
end2 = datetime.datetime.now()
print "Python insertion sort with binary search took time: %s" % (end2-start2)

同样是python,算法不一样,速度差百倍!

时间: 2024-09-14 13:52:35

Python使用二分插入排序竟然比直接插入排序快99倍!的相关文章

Java使用二分插入排序竟然和直接插入排序速度比较

 Java使用二分插入排序竟然和直接插入排序速度比较 之前测试过Python使用二分插入排序竟然比直接插入排序快99倍! 现在测试下 Java,Linux测试结果如下: javac test.java java testInsertSort total milliseconds:15769InsertSortWithBinarySerach total milliseconds:15657 更正下,上面的数据在一台虚拟机上测试的,所以样本不够,理论上,这两个算法的速度应该是有倍数差别的. 感

Python实现二分查找算法实例

  本文实例讲述了Python实现二分查找算法的方法.分享给大家供大家参考.具体实现方法如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 #!/usr/bin/env python import sys def search2(a,m): low = 0 high = len(a) - 1 while(low <= high): mid = (low + high)/2 midval = a[mid] if midval <

我的Java开发学习之旅------&amp;gt;Java经典排序算法之二分插入排序

一.折半插入排序(二分插入排序) 将直接插入排序中寻找A[i]的插入位置的方法改为采用折半比较,即可得到折半插入排序算法.在处理A[i]时,A[0]--A[i-1]已经按关键码值排好序.所谓折半比较,就是在插入A[i]时,取A[i-1/2]的关键码值与A[i]的关键码值进行比较,如果A[i]的关键码值小于A[i-1/2]的关键码值,则说明A[i]只能插入A[0]到A[i-1/2]之间,故可以在A[0]到A[i-1/2-1]之间继续使用折半比较:否则只能插入A[i-1/2]到A[i-1]之间,故可

详解直接插入排序算法与相关的Java版代码实现_java

直接插入排序 直接插入排序的思路很容易理解,它是这样的: 1.把待排序的数组分成已排序和未排序两部分,初始的时候把第一个元素认为是已排好序的. 2.从第二个元素开始,在已排好序的子数组中寻找到该元素合适的位置并插入该位置. 3.重复上述过程直到最后一个元素被插入有序子数组中. 4.排序完成. 示例:思路很简单,但代码并非像冒泡排序那么好写.首先,如何判断合适的位置?大于等于左边.小于等于右边?不行,很多边界条件需要考虑,而且判断次数太多.其次,数组中插入元素,必然需要移动大量元素,如何控制它们的

内部排序:插入排序和希尔排序的N种实现

前言 本来想将所有的内部排序总结为一篇博文,但是随着研究的深入,还是放弃了这个念头,斟前酌后,还是觉得分开来写比较好,具体原因,看完本篇博文也就自然明了了. 本篇文章主要探讨插入排序和希尔排序,之所将二者放在一起,很明显,是因为希尔排序是建立在插入排序的基础之上的. 注:以下各排序算法的N种实现方法大部分都是我根据算法思想,自己写出来的,或者是参考其本身的经典实现,我自己都已测试通过,但不敢保证一定都没问题,如果有疑问,欢迎指出. 插入排序 插入排序的思想很简单,它的基本操作就是将一个数据插入到

数据结构教程 第三十四课 插入排序、快速排序

教学目的: 掌握排序的基本概念,插入排序.快速排序的算法 教学重点: 插入排序.快速排序的算法 教学难点: 快速排序算法 授课内容: 一.排序概述 排序:将一个数据元素的无序序列重新排列成一个按关键字有序的序列. 姓名 年龄 体重 1李由 57 62 2王天 54 76 3七大 24 75 4张强 24 72 5陈华 24 53 上表按年龄无序,如果按关键字年龄用某方法排序后得到下表: 姓名 年龄 体重 3七大 24 75 4张强 24 72 5陈华 24 53 2王天 54 76 1李由 57

【排序算法】插入排序

本篇博客的主要内容是插入排序.常用的插入排序方法有直接插入排序.折半插入排序.表插入排序和希尔排序.这里介绍两个,直接插入排序和希尔排序. 在介绍排序算法时,我将从基本思想.实例讲解.代码理解三个方面整理. [直接插入排序] 1.基本思想 直接插入排序(Straight Insertion Sorting)的基本思想是一次将每个记录插入到一个已排好序的有序表中去,从而得到一个新的.记录数增加1的有序表. 2.具体做法 我们把第一个序列元素看成是已经排好序的一个记录,后面的元素依次与已排好序的序列

我的Java开发学习之旅------&amp;gt;Java经典排序算法之插入排序

一.算法原理 插入排序法:所谓插入排序法乃是将一个数目插入该占据的位置. 假设我们输入的是 "53,27,36,15,69,  42" 我们从第二个数字开始,这个数字是27,我们的任务只要看看27有没有正确的位置,我们的做法是和这个数字左边的数字来比,因此我们比较27和53,27比53小,所以我们就交换27和53,原来的排列就变成了"27, 53, 36, 15, 69, 42 " 接下来,我们看第3个数字有没有在正确的位置.这个数字是36,它的左边数字是53,36

java直接插入排序示例_java

影响排序效率的一般从3个方面比较:数据比较的次数,数据移动的次数,内存空间占用的大小.我们就冒泡排序.选择排序.插入排序.快速排序做一个总的比较.一般情况下不会使用冒泡排序算法,因为它的比较次数和移动次数在几种排序算法中都是最多的,它的唯一好处是算法简单,易于理解,所以在数据量很小的时候它会有些应用价值.选择排序在比较次数上和冒泡排序一样,都是n的平方,但它把交换的次数降低到了最低,所以在数据量很小且交换数据相对于比较数据更加耗时的情况下,可以应用选择排序.在大多数情况下,当数据量比较小或基本上