2720 - Bucket Sort

De la Universitas MediaWiki

Enunț

Metoda Bucket Sort constă în distribuirea elementelor în mai multe grupe, numite “bucket-uri”. Apoi fiecare bucket este sortat individual folosind un algoritm de sortare oarecare.

Cerința

Se dă un şir cu n numere naturale ce trebuie sortat în funcţie de d. Dacă d este 1, şirul se va sorta descrescător, iar dacă este 0, se va sorta crescător.

Date de intrare

Fișierul de intrare bucketsortin.txt conține pe prima linie numărul n, iar pe a doua linie n numere naturale separate prin spații, iar pe a treia linie se va afla d.

Date de ieșire

Fișierul de ieșire bucketsortout.txt va conține pe prima linie şirul sortat în funcţie de d.

Restricții și precizări

  • n ≤ 10.000
  • toate numerele ≤ 100.000.000
  • d=0 pentru 50% din teste
  • d=1 pentru 50% din teste

Exemplu 1:

bucketsort.in

5

10 90 5 6 101

0

bucketsort.out

5 6 10 90 101

Explicație

Deoarece d este 0, şirul se sortează crescător

Exemplu 2:

bucketsort.in

5

10 90 5 6 101

1

bucketsort.out

101 90 10 6 5

Explicație

Deoarece d este 1, şirul se sortează descrescător

Rezolvare

def validate_input(n, numbers, d):
    if n > 10000:
        return False
    if any(num > 100000000 for num in numbers):
        return False
    if d not in [0, 1]:
        return False
    return True

def bucket_sort(arr, d):
    n = len(arr)
    buckets = [list() for _ in range(10)]

    max_val = max(arr)
    exp = 1

    while max_val // exp > 0:
        for i in range(n):
            index = arr[i] // exp % 10
            buckets[index].append(arr[i])

        arr = []
        for bucket in buckets:
            if d == 1:
                arr = bucket + arr
            else:
                arr.extend(bucket)

            bucket.clear()

        exp *= 10

    return arr

# Citirea datelor din fișierul de intrare
with open("bucketsortin.txt", "r") as infile:
    n = int(infile.readline().strip())
    numbers = list(map(int, infile.readline().split()))
    d = int(infile.readline().strip())
# Apelarea funcției de sortare
sorted_numbers = bucket_sort(numbers, d)

# Scrierea rezultatului în fișierul de ieșire
with open("bucketsortout.txt", "w") as outfile:
    outfile.write(" ".join(map(str, sorted_numbers)))