begin var a := ArrRandom(ReadInteger('n='), -50, 50);a.Println; var b := a.IndexesOf(t -> t.IsEven).ToArray; var b1 := a.Where(t -> t.IsEven).Sorted.ToArray; var b2 := ArrFill(a.Length, 1); if b.Length < 0 then begin a.Println; exit; end; for var i := 0 to b.Length - 1 do b2[b[i]] := b1[i]; for var i := 0 to a.Length - 1 do if b2[i].IsOdd then b2[i] := a[i]; b2.Println; end.
При записи на новый жесткий диск файлы записываются последовательно расположенными кусочками (кластерами). Спустя некоторое время – после копирования, переноса, удаления папок и файлов и т.п. – эти самые кусочки оказываются разбросанными по жесткому диску, образуя, так называемые, дырки. Сами файлы не повреждаются, просто их части записаны оказываются далеко друг от друга, в разных ячейках жесткого диска и в итоге, в процессе считывания файла головкой жесткого диска, ей приходится искать его фрагменты по всей поверхности, что замедляет работу. В качестве аналогии приведу пример: У Вас есть конструктор. Изначально он упакован в коробку, где каждая деталь лежит рядом с деталью такого же цвета, размера и формы. Допустим, что эти (одинаковые) детальки даже изначально скреплены между собой и представляют собой одно целое (файл). Но, через некоторое время, после того как Вы много много играли с конструктором, строили и тд и тп, детали в коробке разъединились и перемешались Вашими же усилиями, а посему, чтобы найти нужную Вам, потребуется теперь больше времени, чем это было изначально, когда они были все рядышком друг с другом. Это и есть фрагментация - разные части одного целого находятся теперь в разных частях коробки, среди неидентичного содержания (т.е других по форме, цвету и тп деталек). Дефрагментация же представляет собой процесс сбора разбросанных частей (фрагментов) снова воедино
Если на диске много фрагментированных файлов, скорость их чтения с носителя уменьшается. Помимо замедления компьютера в работе с файловыми операциями (таких, как чтение и запись), фрагментация файлов негативно сказывается на «здоровье» жёсткого диска, так как заставляет постоянно перемещаться позиционирующие головки диска, которые осуществляют чтение и запись данных.
Для устранения проблемы фрагментации существуют программы-дефрагментаторы, принцип работы которых заключается в «сборе» каждого файла из его фрагментов.
//Версия 3.3, сборка 1634 (14.02.2018)
begin
var a := ArrRandom(ReadInteger('n='), -50, 50);a.Println;
var b := a.IndexesOf(t -> t.IsEven).ToArray;
var b1 := a.Where(t -> t.IsEven).Sorted.ToArray;
var b2 := ArrFill(a.Length, 1);
if b.Length < 0 then begin a.Println; exit; end;
for var i := 0 to b.Length - 1 do b2[b[i]] := b1[i];
for var i := 0 to a.Length - 1 do if b2[i].IsOdd then b2[i] := a[i];
b2.Println;
end.
Пример:
n= 10
30 9 27 25 -34 25 -5 5 46 -46
-46 9 27 25 -34 25 -5 5 30 46