sortowanie
unknown
python
4 years ago
4.4 kB
8
Indexable
def sort(filename):
if filename not in os.listdir('.'):
print(f'[ERROR] Can\'t find {filename}!')
return None
curr_dest = 'dest'
while True:
if curr_dest == 'dest':
source_read = open(filename, 'rb')
dest_file = 'temp_dest.bin'
else:
source_read = open('temp_dest.bin', 'rb')
dest_file = filename
left = True
# divide to tapes
while pack_records := source_read.read(12 * 10):
records = [bytes_to_record(pack_records[i:i + 12]) for i in range(0, len(pack_records), 12)]
left_container = records[0].to_list()
right_container = []
for i in range(1, len(records)):
if records[i].value() < records[i - 1].value():
left = not left
if left:
left_container = left_container + records[i].to_list()
else:
right_container = right_container + records[i].to_list()
# save to tapes
with open('left_tape.bin', 'wb') as f:
array('i', left_container).tofile(f)
with open('right_tape.bin', 'wb') as f:
array('i', right_container).tofile(f)
# merge
open(dest_file, 'w').close()
dest_records = []
with open('left_tape.bin', 'rb') as left_tape:
with open('right_tape.bin', 'rb') as right_tape:
with open(dest_file, 'ab') as dest:
left_container = left_tape.read(12 * 5)
right_container = right_tape.read(12 * 5)
left_records = [bytes_to_record(left_container[i:i + 12]) for i in range(0, len(left_container), 12)]
right_records = [bytes_to_record(right_container[i:i + 12]) for i in range(0, len(right_container), 12)]
left_i = 0
right_i = 0
while True:
if left_i != 0 and left_i == len(left_records):
left_container = left_tape.read(12 * 5)
left_records = [bytes_to_record(left_container[i:i + 12]) for i in
range(0, len(left_container), 12)]
left_i = 0
if right_i != 0 and right_i == len(right_records):
right_container = right_tape.read(12 * 5)
right_records = [bytes_to_record(right_container[i:i + 12]) for i in
range(0, len(right_container), 12)]
right_i = 0
if len(left_records) + len(right_records) == 0:
array('i', dest_records).tofile(dest)
break
if len(right_records) == 0:
dest_records = dest_records + left_records[left_i].to_list()
left_i += 1
elif len(left_records) == 0:
dest_records = dest_records + right_records[right_i].to_list()
right_i += 1
elif left_records[left_i].value() <= right_records[right_i].value():
dest_records = dest_records + left_records[left_i].to_list()
left_i += 1
elif right_records[right_i].value() < left_records[left_i].value():
dest_records = dest_records + right_records[right_i].to_list()
right_i += 1
if len(dest_records) == 3 * 10: # 10 records - 30 numbers
array('i', dest_records).tofile(dest)
dest_records = []
with open(dest_file, 'rb') as f:
dest_records = f.read()
dest_records = [bytes_to_record(dest_records[i:i + 12]) for i in range(0, len(dest_records), 12)]
if all(dest_records[i].value() <= dest_records[i + 1].value() for i in range(len(dest_records) - 1)):
if curr_dest == 'source':
break
if curr_dest == 'dest':
curr_dest = 'source'
else:
curr_dest = 'dest'Editor is loading...