Advertisement
Guest User

Untitled

a guest
Jul 8th, 2010
323
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.70 KB | None | 0 0
  1.  
  2. import random
  3. import math
  4. import timeit
  5. import heapq
  6.  
  7. N = 100
  8.  
  9.  
  10. # Insertion sort
  11.  
  12. def insertionsort(A):
  13.     for i in xrange(1, len(A)):
  14.         v = A[i]
  15.         j = i-1
  16.         while j >= 0 and A[j] > v:
  17.             A[j + 1] = A[j]
  18.             j -= 1
  19.         A[j + 1] = v
  20.     return A
  21.  
  22. def test_insertionsort():
  23.     D = range(N)
  24.     random.shuffle(D)
  25.     assert insertionsort(D) == range(N)
  26.    
  27.  
  28. # Selection sort
  29.  
  30. def selectionsort(A):
  31.     n = len(A)
  32.     for i in range(n-1):
  33.         m = i
  34.         for j in range(i+1, n):
  35.             if A[j] < A[m]:
  36.                 m = j
  37.         A[i], A[m] = A[m], A[i]
  38.  
  39.     return A
  40.  
  41. def test_selectionsort():
  42.     D = range(N)
  43.     random.shuffle(D)
  44.     assert selectionsort(D) == range(N)
  45.    
  46.  
  47. # Mergesort
  48.  
  49. def merge(left, right):
  50.     if not left:
  51.         return right
  52.     if not right:
  53.         return left
  54.  
  55.     result = []            
  56.     while (left and right):
  57.         if left[0] <= right[0]:
  58.             result.append(left.pop(0))
  59.         else:
  60.             result.append(right.pop(0))
  61.  
  62.     if left:
  63.         result.extend(left)
  64.     if right:
  65.         result.extend(right)
  66.  
  67.     return result
  68.  
  69. def _merge(left, right):
  70.     # I'm cheating... technically, I'm doing a heapsort here
  71.     result = left + right
  72.     heapq.heapify(result)
  73.     return [heapq.heappop(result) for n in xrange(len(result))]
  74.  
  75.  
  76. def mergesort(A):
  77.     n = len(A)
  78.     if n <= 1:
  79.         return A
  80.     if n <= 30:
  81.         return insertionsort(A)
  82.     else:
  83.         m = n // 2
  84.         right = A[m:]
  85.         result = merge(mergesort(A[:m]), mergesort(A[m:]))
  86.         return result
  87.  
  88.  
  89. def test_mergesort():
  90.     D = range(N)
  91.     random.shuffle(D)
  92.     assert mergesort(D) == range(N)
  93.    
  94.  
  95. # Quicksort
  96.            
  97. def quicksort(A):
  98.     if len(A) <= 1:
  99.         return A
  100.     pivot = A[len(A)/2]
  101.  
  102.     less = [x for x in A if x < pivot]
  103.     equal = [x for x in A if x == pivot]
  104.     greater = [x for x in A if x > pivot]
  105.    
  106.     return quicksort(less) + equal + quicksort(greater)
  107.        
  108. def test_quicksort():
  109.     D = range(N)
  110.     random.shuffle(D)
  111.     assert quicksort(D) == range(N)
  112.    
  113.  
  114. # Heapsort
  115.  
  116. def heapify(A, count):
  117.     start = (count - 1) / 2
  118.     while start >= 0:
  119.         siftdown(A, start, count-1)
  120.         start = start - 1
  121.  
  122. def siftdown(A, start, end):
  123.     root = start
  124.     while root * 2 + 1 <= end:
  125.         child = root * 2 + 1
  126.         if child < end and A[child] < A[child+1]:
  127.             child = child + 1
  128.         if A[root] < A[child]:
  129.             A[root], A[child] = A[child], A[root]
  130.             root = child
  131.         else:
  132.             break
  133.  
  134. def heapsort(A):
  135.     count = len(A)
  136.     heapify(A, count)
  137.  
  138.     end = count - 1
  139.     while end > 0:
  140.         A[end], A[0] = A[0], A[end]
  141.         end = end - 1
  142.         siftdown(A, 0, end)
  143.     return A
  144.  
  145. def test_heapsort():
  146.     D = range(N)
  147.     random.shuffle(D)
  148.     assert heapsort(D) == range(N)
  149.    
  150.  
  151. # Bubblesort
  152.  
  153. def bubblesort(A):
  154.     while 1:
  155.         swap = 0
  156.  
  157.         for i in range(len(A)-1):
  158.             j = i + 1
  159.             if A[i] > A[j]:
  160.                 A[j], A[i] = A[i], A[j]
  161.                 swap = 1
  162.  
  163.         if not swap:
  164.             break
  165.  
  166.     return A
  167.  
  168. def test_bubblesort():
  169.     D = range(N)
  170.     random.shuffle(D)
  171.     assert bubblesort(D) == range(N)
  172.    
  173.  
  174. # Cocktailsort
  175.  
  176. def cocktailsort(A):
  177.     while 1:
  178.         swap = 0
  179.  
  180.         for i in range(len(A)-1):
  181.             j = i + 1
  182.             if A[i] > A[j]:
  183.                 A[j], A[i] = A[i], A[j]
  184.                 swap = 1
  185.  
  186.         for i in reversed(range(len(A)-1)):
  187.             j = i + 1
  188.             if A[i] > A[j]:
  189.                 A[j], A[i] = A[i], A[j]
  190.                 swap = 1
  191.  
  192.         if not swap:
  193.             break
  194.        
  195.     return A
  196.  
  197. def test_cocktailsort():
  198.     D = range(N)
  199.     random.shuffle(D)
  200.     assert cocktailsort(D) == range(N)
  201.    
  202.  
  203. # Strandsort
  204.  
  205. def strandsort(A):
  206.     results = []
  207.     while A:
  208.         sublist = [A.pop(0)]
  209.         i = 0
  210.         while i < len(A):
  211.             if A[i] > sublist[-1]:
  212.                 sublist.append(A.pop(i))
  213.             i += 1
  214.  
  215.         results = merge(results, sublist)
  216.  
  217.     A[:] = results
  218.     #return results
  219.    
  220. def test_strandsort():
  221.     N = 2 ** 13
  222.     D = range(N)
  223.     random.shuffle(D)
  224.     strandsort(D)
  225.     assert D == range(N)
  226.    
  227.  
  228. # Combsort
  229.  
  230. # basegap -> 1/(1-1/(e**phi))
  231. BASEGAP = 1/(1-(1/(math.e**((1+math.sqrt(5))/2))))
  232.  
  233. def combsort(A):
  234.     gap = len(A)
  235.     swap = 1
  236.  
  237.     while gap > 1 and swap:
  238.         if gap > 1:
  239.             gap = int(gap / BASEGAP)
  240.  
  241.         i = 0
  242.         swap = 0
  243.         while i + gap < len(A):
  244.             igap = i + gap
  245.             if A[i] > A[igap]:
  246.                 A[i], A[igap] = A[igap], A[i]
  247.                 swap = 1
  248.             i += 1
  249.     return A
  250.            
  251. def test_combsort():
  252.     D = range(N)
  253.     random.shuffle(D)
  254.     combsort(D)
  255.     assert D == range(N)
  256.    
  257.  
  258.    
  259.  
  260.  
  261. def main():
  262.  
  263.    
  264.    
  265.     print 'insertionsort, %.2f usec/pass'%(10000 * timeit.Timer('test_insertionsort()', 'from __main__ import test_insertionsort').timeit(number=10000) / 10000)
  266.     print 'cocktailsort, %.2f usec/pass'%(10000 * timeit.Timer('test_cocktailsort()', 'from __main__ import test_cocktailsort').timeit(number=10000) / 10000)
  267.     #print 'mergesort, %.2f usec/pass'%(10000 * timeit.Timer('test_mergesort()', 'from __main__ import test_mergesort').timeit(number=10000) / 10000)
  268.  
  269.    
  270.     #test_insertionsort()
  271.     #test_selectionsort()
  272.     #test_mergesort()
  273.     #test_quicksort()
  274.     #test_heapsort()
  275.     #test_bubblesort()
  276.     #test_cocktailsort()
  277.     #test_strandsort()
  278.     #test_combsort()
  279.  
  280.    
  281.  
  282. if __name__ == '__main__':
  283.     main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement