2720 - Bucket Sort: Difference between revisions
Andrada378 (talk | contribs) Pagină nouă: 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... |
Andrada378 (talk | contribs) No edit summary |
||
Line 1: | Line 1: | ||
== 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. | 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. | 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. | |||
Fișierul de intrare | |||
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 | |||
bucketsort.in | == Exemplu 1: == | ||
'''bucketsort.in''' | |||
5 | 5 | ||
Line 33: | Line 27: | ||
0 | 0 | ||
bucketsort.out | '''bucketsort.out''' | ||
5 6 10 90 101 | 5 6 10 90 101 | ||
== Explicație == | |||
Deoarece d este 0, şirul se sortează crescător | Deoarece d este 0, şirul se sortează crescător | ||
== Exemplu 2: == | |||
'''bucketsort.in''' | |||
bucketsort.in | |||
5 | 5 | ||
Line 51: | Line 43: | ||
1 | 1 | ||
bucketsort.out | '''bucketsort.out''' | ||
101 90 10 6 5 | 101 90 10 6 5 | ||
== Explicație == | |||
Deoarece d este 1, şirul se sortează descrescător | |||
== Rezolvare == | |||
<syntaxhighlight lang="python"> | |||
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): | def bucket_sort(arr, d): | ||
n = len(arr) | n = len(arr) | ||
buckets = [list() for _ in range(10)] | buckets = [list() for _ in range(10)] | ||
max_val = max(arr) | max_val = max(arr) | ||
exp = 1 | exp = 1 | ||
Line 76: | Line 76: | ||
for bucket in buckets: | for bucket in buckets: | ||
if d == 1: | if d == 1: | ||
arr = bucket + arr | arr = bucket + arr | ||
else: | else: | ||
arr.extend(bucket) | arr.extend(bucket) | ||
bucket.clear() | bucket.clear() | ||
Line 91: | Line 91: | ||
numbers = list(map(int, infile.readline().split())) | numbers = list(map(int, infile.readline().split())) | ||
d = int(infile.readline().strip()) | d = int(infile.readline().strip()) | ||
# Apelarea funcției de sortare | # Apelarea funcției de sortare | ||
sorted_numbers = bucket_sort(numbers, d) | sorted_numbers = bucket_sort(numbers, d) |
Latest revision as of 22:43, 3 January 2024
Enunț[edit | edit source]
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[edit | edit source]
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[edit | edit source]
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[edit | edit source]
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[edit | edit source]
- n ≤ 10.000
- toate numerele ≤ 100.000.000
- d=0 pentru 50% din teste
- d=1 pentru 50% din teste
Exemplu 1:[edit | edit source]
bucketsort.in
5
10 90 5 6 101
0
bucketsort.out
5 6 10 90 101
Explicație[edit | edit source]
Deoarece d este 0, şirul se sortează crescător
Exemplu 2:[edit | edit source]
bucketsort.in
5
10 90 5 6 101
1
bucketsort.out
101 90 10 6 5
Explicație[edit | edit source]
Deoarece d este 1, şirul se sortează descrescător
Rezolvare[edit | edit source]
<syntaxhighlight lang="python"> 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)))
</syntaxhighlight>