Seminar 2

Acest seminar propune mai multe tipuri de sortari precum si aplicatii ale acestora.

Insertion Sort

Complexitate: O(n2)

Iteram prin vector si la fiecare pas j avem sortat vectorul A[1..j-1] si cautam locul lui A[j].


for j = 2 to len
  key = A[j]
  i = j - 1
  while i > 0 and A[i] > key
      A[i + 1] = A[i] //deplasam totul la dreapta pt a-i face loc
      --i
   A[i + 1] = key
   

Merge Sort

Complexitate: O(n log n)

Foloseste paradigma divide and conquer divide: imparte inputul A[1..n] in 2 parti egale conquer: sortam recursiv cele doua jumatati combine: aplicam merge pe cele 2 subsiruri sortate (liniar)

  
  Merge_Sort(A, p, r)
  
    if p < r
      q = (p + r) / 2
      Merge_Sort(A, p, q)
      Merge_Sort(A, q + 1, r)
      Merge(A, p, q, r)
    

Quick Sort

Complexitate: O(n log n)

La fiecare pas gasim pozitia pivotului in sirul sortat

divide: partitioneaza inputul A[p..r] in A[p..q-1] si A[q+1..r] cu proprietatea ca A[p..q-1] <= A[q] si A[q] <= A[q+1..r] conquer: sortam ambele subsiruri apeland recursiv quicksortul combine: alipim sirurile

Partitia se poate face in mai multe moduri: -Hoare -Lomuto -cu pivot mobil -randomizat (mai eficient pe cazul mediu) -median of 3


Quick_Sort(A, p, r)
  q = Partition(A, p, r)
  Quick_Sort(A, p, q - 1)
  Quick_Sort(A, q+1, r)
  
Partition:
  pivot = A[r]
  i = p - 1
  for j = p to r - 1
    if A[j] <= pivot
      ++i
      swap A[i] A[j]
  swap A[i + 1] A[r]
  return i + 1
  

Bucket Sort

Complexitate: O(n)

presupune ca elementele sunt generate dupa o distributie uniforma in [0, 1)

Inputul este impartit in k bucketuri. Fiecare din bucket contine lementele din itervalul [i / k, (i+1) / k) si se sorteaza cu insertion sort

functioneaza cand suma patratelor dimensiunii bucketului e liniar

Counting Sort

Complexitate: O(n)

presupune ca elementele sunt in intervalul [0, k]

Se calculeaza frecventa elementelor. Punem elemente pe pozitia corespunzatoare,. c[x] - numarul de elemente <= x


Counting_Sort
  for j = 1 to n
    c[a[j]]++
  for i = 1 to k
    c[i] = c[i] + c[i - 1]
  for j = n to 1
    b[c[a[j]]] = a[j]
    c[a[j]]--;

Radix Sort

  • folosit in sortarea pachetelor de carti
  • folosit in sortarea elementelor cu multiple campuri

Se sorteaza numerele succesiv dupa cifre, de la cea mai nesemnificativa spre cea mai semnificativa. Sortarea folosita la fiecare pas trebuie sa fie stabila. (nu schimba ordinea cartilor apartinand anterior aceleiasi categorii)


Radix_Sort
  for i = 1 to d
    sortez stabil numerele dupa cifra a i-a in ordinea importantei
    

Probleme:

  • Rucsac discontinuu
  • sdo kth smallest
  • Inv click
  • Binar click
  • Puncte pe o dreapta: Se dau n puncte in plan. Care e numarul maxim de puncte aflate pe aceasi dreapta.
  • Numarul trapezelor Se dau n puncte in plan. Cate trapeze putem forma?
  • Sorting in wave click

Extra:

  • x si y astfel incat (x, y) minim si cmmdc se calculeaza in fix i pasi
  • find duplicate
  • The stolen breakfast drone - element fara pereche
  • Split Rectangle
  • Find element that apears once (others - 3 times)