Advertisement
stefano_p

QuickSelectDeterm.py

Nov 21st, 2016
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 8.16 KB | None | 0 0
  1. import random
  2. import time
  3.  
  4.  
  5.  
  6.  
  7. '''
  8. File name : divide_n_quintuple
  9. Created on : 18/11/2016
  10. @author: --> Stefano Pica N° 0203868
  11. Python Version  3.5.2
  12.  
  13. '''
  14.  
  15.  
  16. def dividi_n_quintuple(lista):
  17.  
  18.     '''funzione che divide la lista data in quintuple e restituisce
  19.    una lista contenete le quituple divise in sottoliste
  20.    usando solo una lista di appoggio'''
  21.  
  22.     listaQuintuple=[]
  23.     indice=0
  24.     while indice < len(lista):
  25.         listaQuintuple += [lista[indice : indice + 5]] # seleziono gli elementi tramite SLICE e anche se
  26.         indice += 5                                    # l'indice supera la lunghezza della lista python nn restituisce
  27.                                                        # errore ma inserisce i rimanenti elementi
  28.     return listaQuintuple
  29.  
  30.  
  31. #if __name__ == '__main__':
  32.     #dividi_n_quintuple(lista=[1,2,3,4,5,6,7,8,9,0,10,11,12,13,14,15])
  33.  
  34.  
  35. ###########################################################################################
  36.  
  37. def selectionSort(l):
  38.     """ It sorts the given Python list in ascending order.
  39.        The key idea is that at the k-th step, you put the the right element in position k.
  40.        O(n^2)
  41.    """
  42.     for k in range(len(l) - 1):
  43.         minPos = k
  44.         for j in range(k + 1, len(l)):
  45.             if l[j] < l[minPos]:
  46.                 minPos = j
  47.         l[minPos], l[k] = l[k], l[minPos]   #Assegnamento multiplo che permette di non usare variabili temporanee
  48.     print(l,'\tselectionSort')
  49.     return l
  50.  
  51.  
  52.  
  53. ###########################################################################################
  54. '''
  55. File name :listaMediani
  56. Created on : 19/11/2016
  57. @author: --> Stefano Pica N° 0203868
  58. Python Version  3.5.2
  59.  
  60. '''
  61.  
  62. def listaMediani(lista):
  63.     '''
  64.        funzione che prende la lista di quintuple richiama la funzione mediano_Quintuple
  65.        e restituisce la lista dei mediani
  66.  
  67.  
  68.    '''
  69.     listaMediani=[]
  70.  
  71.     for i in(lista):
  72.  
  73.         if len(i) == 5:                                        #se è una quintupla richiamo mediano_Quintuple
  74.  
  75.             mediano=mediano_Qintuple(i)
  76.             listaMediani.append(mediano)
  77.                                                                # se non è una quintupla la riordino con selectionSort tempo O(n^2)
  78.         else:                                                  #se è pari prendo n+1 della metà cioè [1,2,3,4] prendo
  79.             listaOrdinata = selectionSort(i)
  80.             listaMediani.append(listaOrdinata[int(len(i)/2)])  #il 3  se [1,2] prendo 2  ; se è dispari < 5 prendo il mediano
  81.                                                                # cioè [1,2,3] prendo il 2
  82.     return listaMediani                                        # se è [1] prendo 1
  83.  
  84.  
  85. ######################################################################################################
  86.  
  87.  
  88. '''
  89. File name :mediano_di_Qintuple.py
  90. Created on : 19/11/2016
  91. @author: --> Stefano Pica N° 0203868
  92. Python Version  3.5.2
  93.  
  94. '''
  95. def mediano_Qintuple(lista):
  96.  
  97.         '''
  98.        funzione che restituisce il mediano di una quintupla in 6 confronti
  99.        come nella propietà 5.1
  100.        cioè esegue 6[n/5] confronti
  101.  
  102.        '''
  103.  
  104.         if lista[0] > lista[1]:
  105.             lista[0],lista[1] = lista[1],lista[0]
  106.  
  107.         if lista[2] > lista[3]:
  108.             lista[2],lista[3] = lista[3],lista[2]
  109.  
  110.         if lista[1] > lista[3]:
  111.             lista[1],lista[4] = lista[4],lista[1]
  112.  
  113.             if lista[0] > lista[1]:
  114.                 lista[0],lista[1] = lista[1],lista[0]
  115.  
  116.         else:
  117.             lista[3], lista[4] = lista[4], lista[3]
  118.             if lista[2] > lista[3]:
  119.                 lista[2],lista[3] = lista[3],lista[2]
  120.  
  121.         if lista[1] > lista[3]:
  122.             lista.append(lista.pop(1))
  123.             if lista[0] > lista[2]:
  124.                 return lista[0]
  125.             else:
  126.                 return lista[2]
  127.  
  128.         else:
  129.             lista.append(lista.pop(3))
  130.             if lista[1] > lista[2]:
  131.                 return lista[1]
  132.             else:
  133.                 return lista[2]
  134.  
  135.  
  136. #if __name__ == '__main__':
  137.     # lista=[6,1,1,4,5]
  138.      #a=mediano_Qintuple(lista)
  139.     # print (a)
  140.  
  141.  
  142.  
  143.  
  144. #################################################################################################
  145.  
  146. '''
  147. File name :medianoDeiMediani
  148. Created on : 19/11/2016
  149. @author: --> Stefano Pica N° 0203868
  150. Python Version  3.5.2
  151.  
  152. '''
  153.  
  154.  
  155. def mediano_dei_mediani(lista):
  156.  
  157.     '''
  158.    prende la lista e con chiamate ricorsive su dividi_n_quintuple e listaMediani
  159.    restituisce il mediano dei mediani
  160.  
  161.    '''
  162.  
  163.     #lista = lista_di_prova
  164.  
  165.     while len(lista) > 1 :                        #finchè la lista dei mediani non diveta di un solo elemento
  166.                                                     # richiamo le funzioni ricorsivamente -> dividi e listaMediani-> che
  167.         quintuple=dividi_n_quintuple(lista)
  168.         print(quintuple,'\tquituple')               # dentro richiama-> (medianoQuintuple)
  169.  
  170.         lista = listaMediani(quintuple)
  171.  
  172.         print(lista,'\tmediani')
  173.  
  174.  
  175.     return lista
  176.  
  177. ######################################################################################
  178.  
  179. #if __name__ == '__main__':
  180.     #inizializzazione
  181.  
  182.     #step=510
  183.  
  184.     #lista_di_prova = [None]*step
  185.  
  186.     #for i in range(0,step):
  187.  
  188.         #lista_di_prova[i] = random.randint(0,step)
  189.  
  190.     #print(lista_di_prova,'\tlista')
  191.     #inizio=time.clock()
  192.     #A = mediano_dei_mediani()
  193.     #tempoTrascorso=time.clock() - inizio
  194.     #print(A,'\t\ttempo =\t',tempoTrascorso)
  195.  
  196.  ##########################################################################################################
  197.  
  198.  
  199.  
  200.  
  201.  
  202.  
  203. ##################################################################################
  204.  
  205. def partition(lista, left, right, det=False):
  206.     inf = left
  207.     sup = right + 1
  208.  
  209.     #if not det:
  210.         #mid = random.randint(left, right)
  211.         #l[left], l[mid] = l[mid], l[left]  # scambio il perno con il primo elemento dell'intervallo considerato
  212.  
  213.     mid = mediano_dei_mediani(lista)  # If deterministic, it is set to the first element. Otherwise, since we swapped the randomically chosen median with the left element, we set mid to left.
  214.  
  215.     #if printSwitch.dumpOperations:
  216.     print("Selected median:", mid)
  217.  
  218.     while True:
  219.         inf += 1
  220.         while inf <= right and lista[inf] <= lista[left]:
  221.             inf += 1
  222.  
  223.         sup -= 1
  224.         while lista[sup] > lista[left]:
  225.             sup -= 1
  226.  
  227.         if inf < sup:
  228.             lista[inf], lista[sup] = lista[sup], lista[inf]
  229.         else:
  230.             break
  231.  
  232.     lista[left], lista[sup] = lista[sup], lista[left]
  233.  
  234.     #if printSwitch.dumpOperations:
  235.     print("- " * left + str(lista[left:right + 1]) + " -" * (len(lista) - right - 1))
  236.  
  237.     return sup
  238.  
  239.  
  240.  
  241.  
  242.  
  243.  
  244.  
  245.  
  246.  
  247.  
  248.  
  249. ###################################################################################
  250.  
  251.  
  252. '''
  253. File name :
  254. Created on :
  255. @author: --> Stefano Pica N° 0203868
  256. Python Version  3.5.2
  257.  
  258. '''
  259.  
  260.  
  261.  
  262. def quickSelectDet(lista, position):  # position 1...n
  263.  
  264.     '''
  265.  
  266.    QuickSelect  deterministico cioè gli passo come mid il mediano dei mediani
  267.  
  268.    '''
  269.  
  270.     if position <= 0 or position > len(lista):
  271.         return None
  272.     return recursiveQuickSelectDet(lista, 0, len(lista) - 1, position)
  273.  
  274.  
  275. def recursiveQuickSelectDet(lista, left, right, position):
  276.     #if printSwitch.dumpOperations:
  277.     print("recursiveQuickSelectRand({},{},{})".format(left, right, position))
  278.  
  279.     if left > right:  # controllo superfluo
  280.         return
  281.  
  282.     if left == right and position - 1 == left:
  283.         return lista[position - 1]
  284.  
  285.     mid = partition(lista, left, right, det=False)
  286.     #if printSwitch.dumpOperations:
  287.     print("mid: {}".format(mid))
  288.  
  289.     if position - 1 == mid:
  290.         return lista[mid]
  291.     if position - 1 < mid:
  292.         return recursiveQuickSelectDet(lista, left, mid - 1, position)
  293.     else:
  294.         return recursiveQuickSelectDet(lista, mid + 1, right, position)
  295.  
  296.  
  297.  
  298.  
  299. # End of quickSelect
  300. if __name__ == '__main__':
  301.     basel = [5, 34, 26, 1, 4, 2, 17, 50, 41, 11]
  302.     k = 5                        
  303.     lista = list(basel)
  304.     print(lista)
  305.     print(quickSelectDet(lista,k))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement