Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from os import remove
- import time
- def next_int(file):
- str = ''
- ch = file.read(1)
- if ch == '-':
- str += '-'
- ch = file.read(1)
- while ch.isdigit():
- str += ch
- ch = file.read(1)
- if str == '':
- return False
- else:
- return int(str)
- def int_count(file):
- position = file.tell()
- file.seek(0)
- count = 0
- i = next_int(file)
- while i:
- count += 1
- i = next_int(file)
- file.seek(position)
- return count
- def merge(file_out_path, file_a_path, file_b_path, ascending_order):
- file_out = open(file_out_path, "r+")
- file_a = open(file_a_path, "r+")
- file_b = open(file_b_path, "r+")
- int_a = next_int(file_a)
- int_b = next_int(file_b)
- while int_a and int_b:
- if (ascending_order and int_a < int_b) or (not ascending_order and int_a >= int_b):
- file_out.write(str(int_a) + " ")
- int_a = next_int(file_a)
- else:
- file_out.write(str(int_b) + " ")
- int_b = next_int(file_b)
- while int_a:
- file_out.write(str(int_a) + " ")
- int_a = next_int(file_a)
- while int_b:
- file_out.write(str(int_b) + " ")
- int_b = next_int(file_b)
- file_out.close()
- file_a.close()
- file_b.close()
- def mergesort(file_name, remove_temp_files=False, ascending_order=True):
- file = open(file_name, "r+")
- length = int_count(file)
- if length >= 2:
- file_a_name = file_name + "_a"
- file_b_name = file_name + "_b"
- file_a = open(file_a_name, "w+")
- file_b = open(file_b_name, "w+")
- for i in range(0, length // 2):
- file_a.write(str(next_int(file)) + " ")
- for i in range(0, length - (length // 2)):
- file_b.write(str(next_int(file)) + " ")
- file_a.close()
- file_b.close()
- mergesort(file_a_name, remove_temp_files, ascending_order)
- mergesort(file_b_name, remove_temp_files, ascending_order)
- merge(file_name, file_a_name, file_b_name, ascending_order)
- if remove_temp_files:
- remove(file_a_name)
- remove(file_b_name)
- if __name__ == '__main__':
- print('Привет! Эта программа служит для сортировки чисел простым слиянием, хранящимся в файле.\n'
- 'Чтобы выйти, введите q на любом этапе\n')
- buffer = ''
- file_name = ''
- ascending_order = False
- remove_temp_files = False
- while True:
- buffer = input('Введите имя файла:\n')
- if buffer.lower() == 'q':
- break
- file = ''
- try:
- file = open(buffer, 'r')
- except FileNotFoundError:
- print('Такого файла не существует! Попробуйте снова.\n\n')
- continue
- file.close()
- file_name = buffer
- buffer = input('Удалить временные файлы? (Y/n):\n')
- if buffer.lower() == 'q':
- break
- remove_temp_files = buffer.lower() == 'y'
- buffer = input('В порядке возрастания? (Y/n):\n')
- if buffer.lower() == 'q':
- break
- ascending_order = buffer.lower() == 'y'
- start_time = time.time_ns()
- mergesort(file_name, remove_temp_files, ascending_order)
- end_time = time.time_ns()
- print('Сортировка завершена!\nЗатраченное ввремя - ' + str(
- (end_time - start_time) / 1000000) + 'мс.\n\n')
- print('Спасибо!')
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement