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,算法不一样,速度差百倍!

时间: 2025-01-02 03:40:40

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

Java使用二分插入排序竟然和直接插入排序速度相差不多

?? Java使用二分插入排序竟然和直接插入排序速度相差不多 之前测试过Python使用二分插入排序竟然比直接插入排序快99倍! 现在测试下 Java,Linux测试结果如下: javac test.java java testInsertSort total milliseconds:15769InsertSortWithBinarySerach total milliseconds:15657 程序如下: import java.util.Date; public class test{ p

python实现排序算法(一)——插入排序算法

1 ''' 2 插入排序算法 3 原始数据data 4 排序数据后数据SortedData,默认是从小打大排序 5 6 1.从data第一个元素开始,该元素赋值给SortedData[0],可以认为SortedData已经被排序 7 8 2.取出data的一个元素data[i], 9 (1)从左到右扫描SortedData, 10 如果data[i]小于SortedData的某个元素SD,那么将data[i]插入SD的位置,选取下一个元素 11 (1)如果data[i]大于SortedData最

Python排序-冒泡排序、选择排序、插入排序

''' 冒泡排序 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成. 这个算法的名字由来是因为越大的元素会经由交换慢慢"浮"到数列的顶端 ''' data_set = [12,45,2,48,66,2,1,56,36,90,5,10,503] for i in range(len(data_set)): ##控制相邻比较的轮数 for j in range(len(data_set

【 python 学习笔记 -- 数据结构与算法 】插入排序 Insertion Sort

[插入排序]:每次保证列表最左端子序列是排好顺序的,然后取下一个元素,扫描其左端的子序列,将其中大于目标元素的元素右移一个位置,直到找到合适的位置将目标元素插入子序列中.逐步增大排序完成的sublist的长度,最终完成整个列表的排序 算法思路如下: 1. 列表最左边第一个元素认为已经排序好了 2. 取下一个元素(目标元素),在它前面已经排序完成的子序列中从后向前扫描 3. 如果子序列中被扫描的当前元素大于目标元素,则将当前元素右移一个位置 4. 重复第3步,直到被扫描的元素小于或等于目标元素 5

插入排序算法之直接插入排序和希尔排序

插入排序算法 有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法--插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的.个数加一的有序数据. 直接插入排序 直接插入排序的排序思路是:每次将一个待排序的元素与已排序的元素进行逐一比较,直到找到合适的位置按大小插入. 例子: 有序列: 开始时,有序序列只有一个元素就是第一个元素(红色),后面的无序序列(绿色).接下来,取无序序列中

Python 实现二分查找算法

最近在学习python,由于在面试中,二分查找算法面试率极高,所以使用python做了一个实现. def search1(sequence, number): lower = 0 upper = len(sequence) - 1 while lower <= upper: mid = (lower + upper) // 2 if number > sequence[mid]: lower = mid + 1 elif number < sequence[mid]: upper = m

PHP之八大排序算法--插入排序(-)直接插入排序

直接插入排序: 插入排序是最简单的排序算法之一,对于有N个元素的序列,插入排序由N-1趟排序组成.它的工作原理是通过构建有序序列,对于未排序的数据,在已经排序序列中从后向前扫描,找到相应位置插入. 插入排序算法步骤: 将第一个待排序的序列的第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列. 从头到尾一次扫描未排序的序列,将扫描到的每个元素插入有序序列的适当位置(在这里需要注意一个问题,如果在有序序列中有一个和待插入的元素相等,则将待插入的元素查到此元素的后面,这样方式的插入

Python实现二分查找法

二分查找可以解决(预排序数组的查找)问题:只要数组中包含T(即要查找的值),那么通过不断缩小包含T的范围,最终就可以找到它.一开始,范围覆盖整个数组.将数组的中间项与T进行比较,可以排除一半元素,范围缩小一半.就这样反复比较,反复缩小范围,最终就会在数组中找到T,或者确定原以为T所在的范围实际为空.对于包含N个元素的表,整个查找过程大约要经过log(2)N次比较. #!/usr/bin/env python # -*- coding: utf-8 -*- def func(l, n): if n

python实现二分查找及bisect模块的简介

在查找方面,python中有list.index()的方法. <span style="font-size:14px;">>>> a=[2,4,1,9,3] #list可以是无序,也可以是有序 >>> a.index(4) #找到后返回该值在list中的位置 1</span> 这是python中基本的查找方法,虽然简单,但是,如果由于其时间复杂度为O(n),对于大规模的查询恐怕是不足以胜任的.二分查找就是一种替代方法. 二分查