Advertisement
Guest User

Untitled

a guest
May 23rd, 2019
37
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.52 KB | None | 0 0
  1. import numpy as np
  2.  
  3. def quicksort1(data, idx_start=None, idx_end=None): # rekurziv implementacio
  4.     if idx_start is None:
  5.         idx_start = 0
  6.     if idx_end is None:
  7.         idx_end = len(data) - 1
  8.     # ha a feldolgozando resz nem tartalmaz legalabb ket elemet, akkor keszen vagyunk
  9.     if idx_end <= idx_start:
  10.         return
  11.     # elemcserekkel particionaljuk a tombot
  12.     mid = data[int((idx_start+idx_end)/2)]
  13.     i = idx_start - 1
  14.     j = idx_end + 1
  15.     while True:
  16.         while True:
  17.             i += 1
  18.             if data[i] >= mid:
  19.                 break
  20.         while True:
  21.             j -= 1
  22.             if data[j] <= mid:
  23.                 break
  24.         if i >= j:
  25.             break
  26.         data[i], data[j] = data[j], data[i]
  27.     # rekurzivan rendezzuk az elso reszt
  28.     quicksort1(data, idx_start, j)
  29.     # rekurzivan rendezzuk a masodik reszt
  30.     quicksort1(data, j+1, idx_end)
  31.  
  32.  
  33. def quicksort2(data): # iterativ implementacio
  34.     # egy veremben tartjuk nyilvan, hogy eppen melyik reszt dolgozzuk fel
  35.     stack = []
  36.     stack.append(0)
  37.     stack.append(len(data)-1)
  38.     # addig dolgozunk, amig van feldolgozando resz (nem ures a verem)
  39.     while len(stack) > 0:
  40.         idx_end = stack.pop()
  41.         idx_start = stack.pop()
  42.         # ha a feldolgozando resz nem tartalmaz legalabb ket elemet, akkor keszen vagyunk
  43.         if idx_end <= idx_start:
  44.             continue
  45.         # elemcserekkel particionaljuk a tombot
  46.         mid = data[int((idx_start+idx_end)/2)]
  47.         i = idx_start - 1
  48.         j = idx_end + 1
  49.         while True:
  50.             while True:
  51.                 i += 1
  52.                 if data[i] >= mid:
  53.                     break
  54.             while True:
  55.                 j -= 1
  56.                 if data[j] <= mid:
  57.                     break
  58.             if i >= j:
  59.                 break
  60.             data[i], data[j] = data[j], data[i]
  61.         # eloirjuk az elso resz rendezeset
  62.         stack.append(idx_start)
  63.         stack.append(j)
  64.         # eloirjuk a masodik resz rendezeset
  65.         stack.append(j+1)
  66.         stack.append(idx_end)
  67.  
  68.  
  69. def test(qsfunc, runs, datasize): # tesztrutin
  70.     num_errors = 0
  71.     for _ in range(runs):
  72.         data = np.random.randint(low=-100, high=100, size=datasize)
  73.         ref = np.sort(data)
  74.         qsfunc(data)
  75.         if any(data-ref):
  76.             print('Hibasan rendezett tomb:', data)
  77.             num_errors += 1
  78.     if num_errors == 0:
  79.         print(qsfunc.__name__ + ' test OK')
  80.  
  81.  
  82. test(quicksort1, 1000, 100)
  83. test(quicksort2, 1000, 100)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement