2720 - Bucket Sort
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 bucketsort.in 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 bucketsort.out 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<syntaxhighlight lang="python"> def bucket_sort(arr, d):
n = len(arr) buckets = [list() for _ in range(10)]
# Determinăm valoarea maximă din listă pentru a determina numărul de cifre 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 # adăugăm la început pentru sortare descrescătoare else: arr.extend(bucket) # adăugăm la sfârșit pentru sortare crescătoare
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)))
</syntaxhighlight>