Advertisement
Guest User

Untitled

a guest
May 22nd, 2019
161
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.66 KB | None | 0 0
  1. from os import remove
  2. import time
  3.  
  4.  
  5. def next_int(file):
  6.     str = ''
  7.     ch = file.read(1)
  8.     if ch == '-':
  9.         str += '-'
  10.         ch = file.read(1)
  11.     while ch.isdigit():
  12.         str += ch
  13.         ch = file.read(1)
  14.     if str == '':
  15.         return False
  16.     else:
  17.         return int(str)
  18.  
  19.  
  20. def int_count(file):
  21.     position = file.tell()
  22.     file.seek(0)
  23.     count = 0
  24.     i = next_int(file)
  25.     while i:
  26.         count += 1
  27.         i = next_int(file)
  28.     file.seek(position)
  29.     return count
  30.  
  31.  
  32. def merge(file_out_path, file_a_path, file_b_path, ascending_order):
  33.     file_out = open(file_out_path, "r+")
  34.     file_a = open(file_a_path, "r+")
  35.     file_b = open(file_b_path, "r+")
  36.  
  37.     int_a = next_int(file_a)
  38.     int_b = next_int(file_b)
  39.  
  40.     while int_a and int_b:
  41.         if (ascending_order and int_a < int_b) or (not ascending_order and int_a >= int_b):
  42.             file_out.write(str(int_a) + " ")
  43.             int_a = next_int(file_a)
  44.         else:
  45.             file_out.write(str(int_b) + " ")
  46.             int_b = next_int(file_b)
  47.     while int_a:
  48.         file_out.write(str(int_a) + " ")
  49.         int_a = next_int(file_a)
  50.     while int_b:
  51.         file_out.write(str(int_b) + " ")
  52.         int_b = next_int(file_b)
  53.  
  54.     file_out.close()
  55.     file_a.close()
  56.     file_b.close()
  57.  
  58.  
  59. def mergesort(file_name, remove_temp_files=False, ascending_order=True):
  60.     file = open(file_name, "r+")
  61.     length = int_count(file)
  62.     if length >= 2:
  63.         file_a_name = file_name + "_a"
  64.         file_b_name = file_name + "_b"
  65.  
  66.         file_a = open(file_a_name, "w+")
  67.         file_b = open(file_b_name, "w+")
  68.  
  69.         for i in range(0, length // 2):
  70.             file_a.write(str(next_int(file)) + " ")
  71.         for i in range(0, length - (length // 2)):
  72.             file_b.write(str(next_int(file)) + " ")
  73.  
  74.         file_a.close()
  75.         file_b.close()
  76.  
  77.         mergesort(file_a_name, remove_temp_files, ascending_order)
  78.         mergesort(file_b_name, remove_temp_files, ascending_order)
  79.         merge(file_name, file_a_name, file_b_name, ascending_order)
  80.         if remove_temp_files:
  81.             remove(file_a_name)
  82.             remove(file_b_name)
  83.  
  84.  
  85. if __name__ == '__main__':
  86.     print('Привет! Эта программа служит для сортировки чисел простым слиянием, хранящимся в файле.\n'
  87.           'Чтобы выйти, введите q на любом этапе\n')
  88.  
  89.     buffer = ''
  90.     file_name = ''
  91.     ascending_order = False
  92.     remove_temp_files = False
  93.     while True:
  94.         buffer = input('Введите имя файла:\n')
  95.         if buffer.lower() == 'q':
  96.             break
  97.         file = ''
  98.         try:
  99.             file = open(buffer, 'r')
  100.         except FileNotFoundError:
  101.             print('Такого файла не существует! Попробуйте снова.\n\n')
  102.             continue
  103.         file.close()
  104.         file_name = buffer
  105.  
  106.         buffer = input('Удалить временные файлы? (Y/n):\n')
  107.         if buffer.lower() == 'q':
  108.             break
  109.         remove_temp_files = buffer.lower() == 'y'
  110.  
  111.         buffer = input('В порядке возрастания? (Y/n):\n')
  112.         if buffer.lower() == 'q':
  113.             break
  114.         ascending_order = buffer.lower() == 'y'
  115.  
  116.         start_time = time.time_ns()
  117.         mergesort(file_name, remove_temp_files, ascending_order)
  118.         end_time = time.time_ns()
  119.         print('Сортировка завершена!\nЗатраченное ввремя - ' + str(
  120.             (end_time - start_time) / 1000000) + 'мс.\n\n')
  121.  
  122.     print('Спасибо!')
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement